Presque toutes les réponses et commentaires ont pesé sur les avantages et la lumière sur les inconvénients. Voici un récapitulatif de tous les avantages et inconvénients jusqu'à présent, ainsi que certains inconvénients cruciaux (au n ° 2 ci-dessous) que je n'ai vu mentionnés qu'une seule fois ou pas du tout.
- AVANTAGES:
1.1. Plus conforme ISO (ISO 8601) (même si je ne sais pas comment cela entre en jeu dans la pratique).
1.2. Plus de gamme (1/1/0001 au 31/12/9999 vs 1/1 / 1753-12 / 31/9999) (bien que la gamme supplémentaire, toutes antérieures à l'année 1753, ne sera probablement pas utilisée sauf pour ex., dans les applications historiques, astronomiques, géologiques, etc.).
1.3. Correspond exactement à la plage de la plage de type .NET DateTime
(bien que les deux convertissent dans les deux sens sans codage spécial si les valeurs sont dans la plage et la précision du type cible, sauf pour Con # 2.1 ci-dessous, sinon une erreur / arrondi se produira).
1.4. Plus de précision (100 nanosecondes aka 0,000,000,1 sec. Contre 3,33 millisecondes aka 0,003,33 sec.) (Bien que la précision supplémentaire ne sera probablement pas utilisée sauf par ex. Dans les applications d'ingénierie / scientifiques).
1.5. Lorsqu'il est configuré pour une précision similaire (comme en 1 millisec pas "identique" (comme en 3,33 millisec) comme Iman Abidi) DateTime
, utilise moins d'espace (7 contre 8 octets), mais bien sûr, vous perdriez le avantage de précision qui est probablement l'un des deux (l'autre étant la gamme) les plus vantés bien que probablement des avantages inutiles).
- LES INCONVÉNIENTS:
2.1. Lors de la transmission d'un paramètre à un .NET SqlCommand
, vous devez spécifier System.Data.SqlDbType.DateTime2
si vous pouvez transmettre une valeur en dehors de la DateTime
plage et / ou de la précision de SQL Server , car elle est par défaut System.Data.SqlDbType.DateTime
.
2.2. Ne peut pas être implicitement / facilement converti en une valeur numérique à virgule flottante (nombre de jours depuis la date-heure min) pour effectuer les opérations suivantes avec / dans les expressions SQL Server à l'aide de valeurs et d'opérateurs numériques:
2.2.1. ajouter ou soustraire # de jours ou jours partiels. Remarque: L'utilisation de DateAdd
Function comme solution de contournement n'est pas anodine lorsque vous devez prendre en compte plusieurs, sinon toutes les parties de la date-heure.
2.2.2. prendre la différence entre deux dates-heures aux fins du calcul de «l'âge». Remarque: Vous ne pouvez pas simplement utiliser la DateDiff
fonction de SQL Server à la place, car elle ne calcule pas age
comme la plupart des gens s'attendent à ce que si les deux dates-heures arrivent à traverser une limite calendrier / horloge date-heure des unités spécifiées, même pour une petite fraction de cette unité, il retournera la différence que 1 de cette unité par rapport à 0. Par exemple, le DateDiff
dans Day
« s de deux fois ce jour seulement 1 milliseconde en dehors retournera 1 vs 0 (jours) si ces dates-heures sont sur différents jours civils (c.-à-d. «1999-12-31 23: 59: 59.9999999» et «2000-01-01 00: 00: 00.0000000»). Les mêmes dates-heures de différence de 1 milliseconde si elles sont déplacées afin qu'elles ne traversent pas un jour calendaire, renverront un «DateDiff» en Day
's de 0 (jours).
2.2.3. prendre la Avg
date-heure (dans une requête agrégée) en convertissant simplement en «Float» d'abord, puis de nouveau en DateTime
.
REMARQUE: pour convertir DateTime2
en numérique, vous devez faire quelque chose comme la formule suivante qui suppose toujours que vos valeurs ne sont pas inférieures à l'année 1970 (ce qui signifie que vous perdez toute la plage supplémentaire plus 217 années supplémentaires. Remarque: vous pouvez ne pas être en mesure d'ajuster simplement la formule pour permettre une plage supplémentaire car vous pouvez rencontrer des problèmes de débordement numérique.
25567 + (DATEDIFF(SECOND, {d '1970-01-01'}, @Time) + DATEPART(nanosecond, @Time) / 1.0E + 9) / 86400.0
- Source: " https://siderite.dev/blog/how-to-translate-t-sql-datetime2-to.html "
Bien sûr, vous pourriez aussi Cast
à la DateTime
première (et si nécessaire de retour à nouveau DateTime2
), mais vous perdriez la précision et la portée (tous avant 1753) les prestations de DateTime2
rapport DateTime
qui sont prolly les 2 plus grands et aussi en même temps prolly les 2 moins probablement nécessaires, ce qui soulève la question de savoir pourquoi l'utiliser lorsque vous perdez les conversions implicites / faciles en virgule flottante numérique (# de jours) pour l'addition / la soustraction / l '"âge" (vs. DateDiff
) / le Avg
bénéfice de calcul qui est un grand dans mon expérience.
En fait, la Avg
date-heure est (ou du moins devrait être) un cas d'utilisation important. a) Outre l'utilisation pour obtenir la durée moyenne lorsque des dates-heures (car une date-heure de base commune) sont utilisées pour représenter la durée (une pratique courante), b) il est également utile d'obtenir une statistique de type tableau de bord sur ce que la date moyenne- l'heure est dans la colonne date-heure d'une plage / d'un groupe de lignes. c) Une requête ad-hoc standard (ou du moins devrait être standard) pour surveiller / dépanner les valeurs dans une colonne qui peuvent ne plus être valides jamais / plus et / ou qui doivent être dépréciées consiste à répertorier pour chaque valeur le nombre d'occurrences et ( le cas échéant) les Min
, Avg
et Max
horodatés associés à cette valeur.