Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Konvertieren Sie „datetime“ in „datetime2“ in SQL Server (T-SQL-Beispiele)

Dieser Artikel enthält Beispiele für die Konvertierung einer datetime Wert zu einem datetime2 Wert in SQL Server.

Beim Konvertieren einer datetime Wert auf datetime2 , hängt der resultierende Wert von der Genauigkeit in Sekundenbruchteilen ab, die Sie datetime2 zuweisen .

Die datetime Der Datentyp hat maximal 3 Ziffern für seinen Sekundenbruchteil. Die Genauigkeit wird auf 0,000, 0,003 oder 0,007 Sekunden gerundet.

Die datetime2 Der Datentyp hingegen ermöglicht es Ihnen, eine Genauigkeit von 0 bis 7 in Sekundenbruchteilen anzugeben. Wenn Sie dies nicht angeben, wird 7 (Standardeinstellung) verwendet.

Beispiel 1 – Implizite Konvertierung

Hier ist ein Beispiel für eine implizite Konvertierung zwischen datetime und datetime2 .

DECLARE 
  @thedatetime datetime, 
  @thedatetime2 datetime2;
SET @thedatetime = '2025-05-21 10:15:30.123';
SET @thedatetime2 = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetime2 AS 'datetime2';

Ergebnis:

+-------------------------+-----------------------------+
| datetime                | datetime2                   |
|-------------------------+-----------------------------|
| 2025-05-21 10:15:30.123 | 2025-05-21 10:15:30.1233333 |
+-------------------------+-----------------------------+

Dies ist eine implizite Konvertierung, da wir keine Konvertierungsfunktion (wie die unten) verwenden, um sie explizit zu konvertieren. In diesem Fall führt SQL Server im Hintergrund eine implizite Konvertierung durch, wenn wir versuchen, datetime zuzuweisen Wert zu einem datetime2 Variable.

Wir können sehen, dass datetime2 Die Variable hat eine höhere Genauigkeit in Sekundenbruchteilen, und wir erhalten am Ende einen Bruchteil von 1233333 (gegenüber 123 für die datetime Wert).

Beispiel 2 – Rundung

Die datetime Der Datentyp wird auf Schritte von 0,000, 0,003 oder 0,007 Sekunden gerundet. Auch wenn Sie ihn explizit auf einen anderen Wert setzen, wird er gerundet. Wie Sie vielleicht erwarten, kann dies zu großer Verwirrung führen, wenn Sie nicht wissen, wie es funktioniert. Es kann nicht nur Verwirrung stiften, wenn datetime verwendet wird an sich kann es zusätzliche Verwirrung stiften, wenn dieser Wert in einen anderen Datentyp konvertiert wird.

Hier ist ein Beispiel, das demonstriert, was ich meine.

DECLARE 
  @thedatetime datetime, 
  @thedatetime2 datetime2;
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thedatetime2 = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetime2 AS 'datetime2';

Ergebnis:

+-------------------------+-----------------------------+
| datetime                | datetime2                   |
|-------------------------+-----------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 |
+-------------------------+-----------------------------+

In diesem Beispiel setze ich die Sekundenbruchteile auf 125 sondern datetime aufgerundet auf 127 (da nur auf 0,000, 0,003 oder 0,007 Sekunden gerundet werden kann).

Die datetime2 Stellen Sie die Sekundenbruchteile jedoch auf 1266667 ein .

Übrigens, wenn wir den Anfangswert einfach auf datetime2 setzen würden an erster Stelle hätte sein Bruchteil 1250000 zurückgegeben .

Beispiel 3 – Präzision/Genauigkeit

Einer der Vorteile von datetime2 ist, dass Sie damit die Genauigkeit von Sekundenbruchteilen angeben können. Wenn Sie dies nicht tun, wird 7 verwendet (deshalb verwendet das vorherige Beispiel 7).

Wir können daher das vorherige Beispiel so ändern, dass datetime2 value verwendet die gleiche Sekundenbruchteilgenauigkeit wie datetime Datentyp.

DECLARE 
  @thedatetime datetime, 
  @thedatetime2 datetime2(3);
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thedatetime2 = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetime2 AS 'datetime2';

Ergebnis:

+-------------------------+-------------------------+
| datetime                | datetime2               |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

Dabei wird datetime2 value gibt das gleiche Ergebnis zurück wie datetime Wert. Es verwendet auch die gleiche Menge an Speicherplatz (8 Bytes). In diesem Fall datetime2 verwendet 7 Byte zum Speichern des Werts und 1 Byte zum Speichern der Genauigkeit des Werts.

Sie können sogar weniger angeben Sekundenbruchteilgenauigkeit als datetime wenn Sie die zusätzliche Präzision nicht benötigen. Dadurch sparen Sie ein ganzes Byte Speicherplatz (Ihr datetime2 value verwendet 7 Bytes, verglichen mit 8 Bytes für datetime Wert).

DECLARE 
  @thedatetime datetime, 
  @thedatetime2 datetime2(2);
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thedatetime2 = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetime2 AS 'datetime2';

Ergebnis:

+-------------------------+------------------------+
| datetime                | datetime2              |
|-------------------------+------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.13 |
+-------------------------+------------------------+

Beachten Sie, dass dies auch dazu führen kann, dass Bruchteile von Sekunden gerundet werden.

Beispiel 4 – Explizite Konvertierung mit CAST()

Hier ist ein Beispiel für eine explizite Konvertierung. In diesem Fall verwende ich den CAST() Funktion direkt innerhalb des SELECT -Anweisung, um explizit zwischen datetime zu konvertieren und datetime2 .

DECLARE @thedatetime datetime;
SET @thedatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thedatetime AS 'datetime',
  CAST(@thedatetime AS datetime2(3)) AS 'datetime2(3)';

Ergebnis:

+-------------------------+-------------------------+
| datetime                | datetime2(3)            |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

Beispiel 5 – Explizite Konvertierung mit CONVERT()

Hier ist ein Beispiel für eine explizite Konvertierung mit CONVERT() Funktion anstelle von CAST() .

DECLARE @thedatetime datetime;
SET @thedatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thedatetime AS 'datetime',
  CONVERT(datetime2(3), thedatetime) AS 'datetime2(3)';

Ergebnis:

+-------------------------+-------------------------+
| datetime                | datetime2(3)            |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

Empfehlung von Microsoft

Microsoft empfiehlt die Verwendung der expliziten Umwandlung, wenn ein gemischtes Vergleichsszenario zwischen diesen beiden Datentypen vorhanden ist:

Unter Datenbank-Kompatibilitätsgrad 130 implizite Konvertierungen von datetime bis datetime2 Datentypen zeigen eine verbesserte Genauigkeit, indem sie die Bruchteile von Millisekunden berücksichtigen, was zu unterschiedlichen konvertierten Werten führt… Verwenden Sie die explizite Umwandlung in datetime2 Datentyp, wenn ein gemischtes Vergleichsszenario zwischen datetime und datetime2 Datentypen existiert.