J'ai une table où je veux suivre le temps afin d'une entrée valide pourrait être la suivante: p>
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. P>
5 Réponses :
faire pas strong> utilise des types de caractères pour stocker des informations de date / heure. P>
Dans SQL Server 2008, vous avez le type code> code> 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 Une autre option serait de choisir une unité de temps - dites, minutes - et utilisez simplement une valeur DateTime code> ou
smalldateTime code> (en fonction de la précision dont vous avez besoin). P>
int code> 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 code> 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 code>. P>
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:
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. P >
En outre, SQL Server 2008 introduit une nouvelle heure code > Type de données
qui vous permet de stocker des valeurs de temps seulement. P>
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 em> 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. P>
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: P>
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: p> 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. P> Maintenant, voici là qu'il est intéressant pour SQL Server: p> à 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. P> et en fait: p> donne '1900-01-04 12: 00: 00.000 'Comme prévu p> afin que vous puissiez le faire (faire une somme autour de la conversion): p> 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. P> P>