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- DateTimeTyps ü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 DateTimewird 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.DateTime2ob Sie möglicherweise einen Wert außerhalb des DateTimeBereichs 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 DateAddFunktion 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 DateDiffstattdessen nicht einfach die SQL Server- Funktion verwenden, da sie nicht so berechnet wird, agewie 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 DateDiffin 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 Day0 (Tagen) zurück.
2.2.3. Nehmen Sie die AvgDatums- und Uhrzeitangaben (in einer aggregierten Abfrage), indem Sie einfach zuerst in "Float" und dann wieder zurück in "Float" konvertieren DateTime.
HINWEIS: Um DateTime2in 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 Castzu DateTimeersten (und ggf. wieder zu DateTime2), aber Sie würden die Genauigkeit und Reichweite (alle vor dem Jahr 1753) Vorteile verlieren DateTime2gegen DateTimedie 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) / AvgBerechnungsvorteil verlieren, was ein großer Vorteil ist durch meine Erfahrung.
Übrigens ist das AvgDatum 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, Avgund MaxDatum-Zeitstempel mit dem Wert zugeordnet.