Fast alle Antworten und Kommentare waren schwer für die Vor- und Nachteile. Hier ist eine Zusammenfassung aller Vor- und Nachteile sowie einige wichtige Nachteile (in Nr. 2 unten), die ich nur einmal oder gar nicht erwähnt habe.
- PROS:
1.1. ISO-konformer (ISO 8601) (obwohl ich nicht weiß, wie dies in der Praxis zum Tragen kommt).
1.2. Mehr Reichweite (1/1/0001 bis 12/31/9999 vs. 1/1 / 1753-12 / 31/9999) (obwohl die zusätzliche Reichweite, alle vor dem Jahr 1753, wahrscheinlich nicht verwendet wird, außer z. in historischen, astronomischen, geologischen usw. Apps).
1.3. Stimmt genau mit dem Bereich des .NET- DateTime
Typs überein (obwohl beide ohne spezielle Codierung vor und zurück konvertieren, wenn die Werte innerhalb des Bereichs und der Genauigkeit des Zieltyps liegen, mit Ausnahme von Con # 2.1 unten, da sonst Fehler / Rundungen auftreten).
1.4. Mehr Präzision (100 Nanosekunden alias 0,000,000,1 Sek. Gegenüber 3,33 Millisekunden alias 0,003,33 Sek.) (Obwohl die zusätzliche Präzision wahrscheinlich nicht verwendet wird, außer zum Beispiel in technischen / wissenschaftlichen Apps).
1.5. Bei einer Konfiguration für ähnliche (wie in 1 Millisekunde nicht "gleich" (wie in 3,33 Millisekunden), wie Iman Abidi behauptet hat) Präzision wie DateTime
wird weniger Speicherplatz benötigt (7 gegenüber 8 Bytes), aber dann würden Sie natürlich die verlieren Präzisionsvorteil, der wahrscheinlich einer der beiden am meisten angepriesenen Vorteile ist (der andere ist der Bereich), wenn auch wahrscheinlich nicht benötigte Vorteile).
- Nachteile:
2.1. Wenn Sie einen Parameter an ein .NET übergeben SqlCommand
, müssen Sie angeben, System.Data.SqlDbType.DateTime2
ob Sie möglicherweise einen Wert außerhalb des DateTime
Bereichs und / oder der Genauigkeit von SQL Server übergeben , da dieser standardmäßig verwendet wird System.Data.SqlDbType.DateTime
.
2.2. Kann nicht implizit / einfach in einen numerischen Gleitkommawert (Anzahl der Tage seit dem Mindestdatum / der Mindestzeit) konvertiert werden, um in SQL Server-Ausdrücken mit numerischen Werten und Operatoren Folgendes zu tun:
2.2.1. Addiere oder subtrahiere Anzahl von Tagen oder Teiltagen. Hinweis: Die Verwendung der DateAdd
Funktion als Problemumgehung ist nicht trivial, wenn Sie mehrere, wenn nicht alle Teile der Datums- und Uhrzeitangabe berücksichtigen müssen.
2.2.2. Nehmen Sie die Differenz zwischen zwei Datums- und Uhrzeitangaben für die Berechnung des Alters. Hinweis: Sie können DateDiff
stattdessen nicht einfach die SQL Server- Funktion verwenden, da sie nicht so berechnet wird, age
wie es die meisten Benutzer erwarten würden, wenn die beiden Datums- und Uhrzeitangaben eine Kalender- / Uhrzeit-Datums- / Uhrzeitgrenze der angegebenen Einheiten überschreiten, wenn auch nur für einen winzigen Bruchteil diese Einheit, wird es gibt die Differenz als 1 diese Einheit gegen 0. Zum Beispiel kann die DateDiff
in Day
‚s von zwei Daten mal nur 1 Millisekunde auseinander 1 vs. 0 (Tage) zurück , wenn diese Datum-Zeiten sind an verschiedenen Kalendertagen (dh "1999-12-31 23: 59: 59.9999999" und "2000-01-01 00: 00: 00.0000000"). Die gleichen Datums- und Uhrzeitunterschiede von 1 Millisekunde, wenn sie verschoben werden, damit sie keinen Kalendertag überschreiten, geben ein "DateDiff" in Day
0 (Tagen) zurück.
2.2.3. Nehmen Sie die Avg
Datums- und Uhrzeitangaben (in einer aggregierten Abfrage), indem Sie einfach zuerst in "Float" und dann wieder zurück in "Float" konvertieren DateTime
.
HINWEIS: Um DateTime2
in eine Zahl umzuwandeln , müssen Sie etwa die folgende Formel ausführen, bei der immer noch davon ausgegangen wird, dass Ihre Werte nicht unter dem Jahr 1970 liegen (was bedeutet, dass Sie den gesamten zusätzlichen Bereich plus weitere 217 Jahre verlieren. Hinweis: Möglicherweise Sie können die Formel nicht einfach anpassen, um einen zusätzlichen Bereich zu ermöglichen, da möglicherweise Probleme mit dem numerischen Überlauf auftreten.
25567 + (DATEDIFF(SECOND, {d '1970-01-01'}, @Time) + DATEPART(nanosecond, @Time) / 1.0E + 9) / 86400.0
- Quelle: „ https://siderite.dev/blog/how-to-translate-t-sql-datetime2-to.html “
Natürlich könnte man auch Cast
zu DateTime
ersten (und ggf. wieder zu DateTime2
), aber Sie würden die Genauigkeit und Reichweite (alle vor dem Jahr 1753) Vorteile verlieren DateTime2
gegen DateTime
die prolly zugleich die 2 größten und auch prolly sind Die 2 am wenigsten benötigten, die die Frage aufwirft, warum sie verwendet werden, wenn Sie die impliziten / einfachen Konvertierungen in Gleitkommazahlen ( Anzahl der Tage) für Addition / Subtraktion / "Alter" (vs. DateDiff
) / Avg
Berechnungsvorteil verlieren, was ein großer Vorteil ist durch meine Erfahrung.
Übrigens ist das Avg
Datum und die Uhrzeit ein wichtiger Anwendungsfall (oder sollte es zumindest sein). a) Neben der Verwendung zum Ermitteln der durchschnittlichen Dauer, wenn Datums- und Uhrzeitangaben (da eine gemeinsame Basisdatum-Uhrzeit) zur Darstellung der Dauer verwendet wird (eine gängige Praxis), ist es b) auch nützlich, eine Dashboard-Statistik über das durchschnittliche Datum zu erhalten. Die Uhrzeit befindet sich in der Datums- / Uhrzeitspalte eines Bereichs / einer Gruppe von Zeilen. c) Eine Standard- Ad-hoc-Abfrage (oder sollte zumindest Standard sein) zur Überwachung / Fehlerbehebung von Werten in einer Spalte, die möglicherweise nie / nicht mehr gültig ist und / oder möglicherweise veraltet sein muss, besteht darin, für jeden Wert die Anzahl der Vorkommen aufzulisten und (falls vorhanden) die Min
, Avg
und Max
Datum-Zeitstempel mit dem Wert zugeordnet.