12
votes

Quelle est la meilleure façon de stocker l'intervalle de temps dans une base de données SQL Server

J'ai une table où je veux suivre le temps afin d'une entrée valide pourrait être la suivante:

  • 1 heure 3 minutes
  • 47 minutes
  • 10 heures
  • 3 minutes 14 secondes

    Quel type de champ est utilisé pour cela. Je pourrais évidemment utiliser Varchar. .Mais je pensais qu'il pourrait y avoir quelque chose de mieux car je voudrais exécuter des requêtes pour totaliser la quantité de temps sur plusieurs enregistrements.


0 commentaires

5 Réponses :


13
votes

faire pas utilise des types de caractères pour stocker des informations de date / heure.

Dans SQL Server 2008, vous avez le type pour cela, ce que vous devez utiliser si vos intervalles de temps sont inférieurs à 1 jour. Dans les versions précédentes, ou si vous devez stocker des intervalles plus importants, vous devrez utiliser DateTime ou smalldateTime (en fonction de la précision dont vous avez besoin).

Une autre option serait de choisir une unité de temps - dites, minutes - et utilisez simplement une valeur int pour représenter le nombre d'unités. Assurez-vous simplement que (a) l'unité que vous choisissez est suffisamment précise pour enregistrer les plus petits intervalles que vous devez suivre, et (b) le type numérique réel est suffisamment grand pour contenir les intervalles les plus importants que vous devez suivre. Un smallint pourrait être suffisant pour suivre le nombre de minutes dans la journée; D'autre part, le suivi du nombre de millisecondes dans un délai de 10 ans devrait être stocké en tant que Bigint .


0 commentaires

5
votes

Utilisez simplement entier pour stocker l'intervalle en quelques secondes. DATDIFF retourne entier. Écrivez une fonction qui le transforme en texte. Celui-ci a besoin de réglages (donc il montre "1 min", pas "1 min"), mais devrait fonctionner ok: xxx


0 commentaires

2
votes

dépend de votre gamme de temps - convertissez tout en quelques secondes et de stocker simplement cette valeur en tant qu' Int, ou si votre plage de fois est plus grande, vous pouvez utiliser des champs pendant des heures, des minutes, des secondes séparément.

En outre, SQL Server 2008 introduit une nouvelle heure Type de données qui vous permet de stocker des valeurs de temps seulement.


0 commentaires

3
votes

comme @AarOnaugers a déclaré utiliser un type de données de Date / Time / Time ou DateTime (au besoin) pour stocker vos valeurs; Mais ces types stockent uniquement une instance dans le temps et non une durée ou une durée. Vous devrez utiliser deux champs pour stocker un intervalle. [TIME_SPAN_START] et [TIME_SPAN_END]. La différence entre les deux vous donnera l'intervalle.

La réponse plus longue à votre question peut être répondue en téléchargeant une copie des "applications de base de données axées sur le temps dans SQL" de Richard T. Snodgrass. Il est librement disponible en PDF, regardez ici:

http://www.cs.arizona.edu/~rts/publications .html


0 commentaires

0
votes

liée à la réponse de Tony, vous pouvez également utiliser une seule colonne DateTime par rapport à une heure de début standard qui est implicite pour tous les intervalles - par exemple: 1/1/1900 12h00.

Dans ce cas, il est assez facile pour le stockage: xxx

Il n'est évidemment pas facile de faire des sommes de lignes, de sorte que vous puissiez penser à ajouter une ou plusieurs colonnes calculées de Daturadiff (S, " 1/1/1900 ', intervalle) pour fournir des secondes pour effectuer des sommes.

Maintenant, voici là qu'il est intéressant pour SQL Server:

à cause de la mise en œuvre de SQL Server pour convertir les numéros à et des dates, 0 -> 1/1/1900 12:00 AM, 0,5 -> 1/1/1900 12:00, 1 -> 1/2/1900 12h00, etc., c'est-à-dire que tout le nombre est traité Comme le nombre de jours depuis le 15/01/1900 et la partie fractionnée est la fraction dans la journée. Donc, vous pouvez réellement ajouter naïvement celles-ci pour obtenir un intervalle.

et en fait: xxx

donne '1900-01-04 12: 00: 00.000 'Comme prévu

afin que vous puissiez le faire (faire une somme autour de la conversion): xxx

Je ne préconise pas cela en général, YMMV, et toute solution de conception que vous choisissez doit être vérifiée contre toutes vos exigences.


0 commentaires