In fast allen Antworten und Kommentaren wurde viel über die Vorteile und wenig über die Nachteile gesprochen. Hier ist eine Zusammenfassung aller Vor- und Nachteile bis jetzt plus einige entscheidende Nachteile (in #2 unten), die ich nur einmal oder gar nicht erwähnt gesehen habe.
- PROS:
1.1. Stärkere ISO-Konformität (ISO 8601) (obwohl ich nicht weiß, wie dies in der Praxis zum Tragen kommt).
1.2. Größerer Bereich (1/1/0001 bis 31.12.9999 gegenüber 1/1/1753-12.31.9999) (obwohl der zusätzliche Bereich, alles vor dem Jahr 1753, wahrscheinlich nicht verwendet wird, außer z. B. in historischen, astronomischen, geologischen usw. Anwendungen).
1.3. Dies entspricht genau dem Bereich von .NET's DateTime
Bereich des Typs (obwohl beide ohne besondere Kodierung hin und her 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 aka 0,000,000,1 Sek. vs. 3,33 Millisekunden aka 0,003,33 Sek.) (obwohl die zusätzliche Präzision wahrscheinlich nicht genutzt wird, außer z.B. in technischen/wissenschaftlichen Anwendungen).
1.5. Wenn konfiguriert für ähnlich (wie in 1 Millisekunde und nicht "gleich" (wie in 3,33 Millisekunden), wie Iman Abidi behauptet hat) Präzision als DateTime
(7 vs. 8 Bytes), aber dann geht natürlich der Präzisionsvorteil verloren, der wahrscheinlich einer der beiden am meisten angepriesenen Vorteile ist (der andere ist die Reichweite), auch wenn er wahrscheinlich nicht benötigt wird.)
- CONS:
2.1. Bei der Übergabe eines Parameters an eine .NET SqlCommand
müssen Sie angeben System.Data.SqlDbType.DateTime2
wenn Sie möglicherweise einen Wert außerhalb des SQL-Servers übergeben DateTime
Bereich und/oder die Genauigkeit, da sie standardmäßig auf System.Data.SqlDbType.DateTime
.
2.2. Kann nicht implizit / einfach in einen numerischen Fließkommawert (Anzahl der Tage seit dem Mindestdatum) konvertiert werden, um in SQL Server-Ausdrücken mit numerischen Werten und Operatoren Folgendes damit zu tun:
2.2.1. die Anzahl der Tage oder Teiltage addieren oder subtrahieren. Anmerkung: Mit DateAdd
Die Funktion als Workaround ist nicht trivial, wenn man mehrere oder gar alle Teile der Datumszeit berücksichtigen muss.
2.2.2. für die Berechnung des "Alters" die Differenz zwischen zwei Datumszeitpunkten nehmen. Hinweis: Sie können nicht einfach die SQL Server-Funktion DateDiff
Funktion, da diese keine Berechnungen durchführt age
wie die meisten Leute erwarten würden, dass, wenn die beiden Datumszeiten zufällig eine Kalender/Uhrzeit-Datumszeit-Grenze der angegebenen Einheiten kreuzen, wenn auch nur für einen winzigen Bruchteil dieser Einheit, es die Differenz als 1 dieser Einheit vs. 0 zurückgeben wird. DateDiff
en Day
von zwei Datumszeiten, die nur 1 Millisekunde auseinander liegen, ergibt 1 vs. 0 (Tage), wenn diese Datumszeiten an unterschiedlichen Kalendertagen liegen (z.B. "1999-12-31 23:59:59.9999999" und "2000-01-01 00:00:00.0000000"). Die gleichen Datumszeiten mit einer Differenz von 1 Millisekunde werden, wenn sie so verschoben werden, dass sie keinen Kalendertag überschneiden, einen "DateDiff" in Day
von 0 (Tagen).
2.2.3. nehmen die Avg
von Datumszeiten (in einer Aggregatabfrage) durch einfaches Konvertieren in "Float" und dann wieder zurück in DateTime
.
HINWEIS: Zum Konvertieren DateTime2
in eine numerische Zahl umzuwandeln, müssen Sie etwas wie die folgende Formel verwenden, die immer noch davon ausgeht, dass Ihre Werte nicht kleiner als das Jahr 1970 sind (was bedeutet, dass Sie den gesamten zusätzlichen Bereich plus weitere 217 Jahre verlieren). Hinweis: Möglicherweise können Sie die Formel nicht einfach anpassen, um den zusätzlichen Bereich zu berücksichtigen, da es zu Problemen mit dem numerischen Überlauf kommen kann.
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önnen Sie auch Cast
a DateTime
zuerst (und gegebenenfalls wieder zurück zu DateTime2
), aber Sie würden die Vorteile von Präzision und Reichweite (alle vor dem Jahr 1753) verlieren DateTime2
vs. DateTime
die prolly die 2 größten und auch zur gleichen Zeit prolly die 2 am wenigsten wahrscheinlich benötigt werden, was die Frage aufwirft, warum es verwenden, wenn Sie die implizite / einfache Konvertierungen in Gleitkommazahlen (# von Tagen) für Addition / Subtraktion / "Alter" (vs. DateDiff
) / Avg
Calcs profitieren, was meiner Erfahrung nach ein großer Vorteil ist.
Übrigens, die Avg
von Datum-Zeiten ist (oder zumindest debe a) Neben der Verwendung, um die durchschnittliche Dauer zu erhalten, wenn Datumszeiten (da eine gemeinsame Basis-Datumszeit) verwendet werden, um die Dauer darzustellen (eine gängige Praxis), b) ist es auch nützlich, eine Dashboard-artige Statistik darüber zu erhalten, was die durchschnittliche Datumszeit in der Datumszeitspalte eines Bereichs / einer Gruppe von Zeilen ist. c) Ein Standard (oder zumindest debe Eine (Standard-)Ad-hoc-Abfrage zur Überwachung / Fehlersuche bei Werten in einer Spalte, die möglicherweise nicht mehr gültig sind und / oder veraltet werden müssen, besteht darin, für jeden Wert die Anzahl des Auftretens und (falls verfügbar) die Min
, Avg
y Max
Datums- und Zeitstempel, die mit diesem Wert verbunden sind.