Dieser Artikel enthält Beispiele für die Konvertierung eines Datums Wert zu einem datetime2 Wert in SQL Server.
Wenn Sie ein Datum konvertieren Wert auf datetime2 , werden dem Wert zusätzliche Informationen hinzugefügt. Das liegt daran, dass datetime2 Datentyp enthält sowohl Datums- als auch Zeitinformationen. Das Datum Datentyp hingegen enthält nur Datumsinformationen.
Die datetime2 Der Datentyp ist im Grunde eine Erweiterung von datetime Datentyp. Es hat einen größeren Datumsbereich, eine größere standardmäßige Bruchteilgenauigkeit und eine optionale benutzerdefinierte Genauigkeit.
In jedem Fall ist der Konvertierungsprozess unabhängig vom Datentyp genau gleich. Der einzige Unterschied besteht in der Menge an Informationen, die zwischen Datum verfügbar sind , datetime und datetime2 .
Beispiel 1 – Implizite Konvertierung
Hier ist ein Beispiel für eine implizite Konvertierung zwischen date und datetime2 .
DECLARE @thedate date, @thedatetime2 datetime2 SET @thedate = '2020-12-01' SET @thedatetime2 = @thedate SELECT @thedate AS 'date', @thedatetime2 AS 'datetime2';
Ergebnis:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 | +------------+-----------------------------+
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, das Datum zuzuweisen Wert zu einem datetime2 Variable.
Wir können das Datum sehen Variable enthält nur Datumsinformationen, während datetime2 Variable enthält sowohl Datums- als auch Zeitinformationen.
Außerdem erhalten wir mehr Zeitinformationen, als wenn wir sie in datetime umwandeln würden Datentyp.
Beim Umrechnen zwischen Datum und datetime2 Bei Verwendung der Standardgenauigkeit (7) wird die Zeitkomponente auf 00:00:00.0000000
gesetzt (im Vergleich zu 00:00:00.000
für datetime ). Sie können die Genauigkeit verringern, wenn Sie dies bevorzugen (siehe unten). Eine Verringerung der Genauigkeit kann auch den zum Speichern des Werts erforderlichen Speicherplatz verringern.
Der Grund, warum die Zeitkomponente nur aus Nullen besteht, liegt darin, dass der Datumswert keine Zeitinformationen enthält, sodass SQL Server keine Möglichkeit hat, die gewünschte Uhrzeit (falls vorhanden) zu kennen.
Beispiel 2 – Uhrzeit ändern
Wenn Sie eine Zeit angeben müssen (aber dasselbe Datum beibehalten), können Sie DATEADD()
verwenden Funktion, um genau das zu tun.
DECLARE @thedate date, @thedatetime2 datetime2 SET @thedate = '2020-12-01' SET @thedatetime2 = @thedate SET @thedatetime2 = DATEADD(hour, 8, @thedatetime2) SELECT @thedate AS 'date', @thedatetime2 AS 'datetime2';
Ergebnis:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 08:00:00.0000000 | +------------+-----------------------------+
Beispiel 3 – 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, explizit zwischen date zu konvertieren und datetime2 .
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CAST(@thedate AS datetime2) AS 'datetime2';
Ergebnis:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 | +------------+-----------------------------+
Wir erhalten also das gleiche Ergebnis wie bei der impliziten Konvertierung.
Wir können die Zeit auch so anpassen:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(hour, 8, CAST(@thedate AS datetime2)) AS 'datetime2';
Ergebnis:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 08:00:00.0000000 | +------------+-----------------------------+
Beispiel 4 – Explizite Konvertierung mit CONVERT()
Hier ist ein Beispiel für eine explizite Konvertierung mit CONVERT()
Funktion anstelle von CAST()
.
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CONVERT(datetime2, @thedate) AS 'datetime2';
Ergebnis:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 | +------------+-----------------------------+
Und die Uhrzeit anpassen:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(hour, 8, CONVERT(datetime2, @thedate)) AS 'datetime2';
Ergebnis:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 08:00:00.0000000 | +------------+-----------------------------+
Beispiel 5 – Genauigkeit
Die datetime2 Datentyp ermöglicht es Ihnen, die Genauigkeit anzugeben (bis zum Standardwert 7). Mit anderen Worten, Sie müssen nicht die vollen 7 Ziffern verwenden, wenn Sie nicht müssen.
Beispiel:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CONVERT(datetime2(2), @thedate) AS 'datetime2(2)', CONVERT(datetime2(4), @thedate) AS 'datetime2(4)';
Ergebnis:
+------------+------------------------+--------------------------+ | date | datetime2(2) | datetime2(4) | |------------+------------------------+--------------------------| | 2020-12-01 | 2020-12-01 00:00:00.00 | 2020-12-01 00:00:00.0000 | +------------+------------------------+--------------------------+
Ein Vorteil der Verringerung der Genauigkeit besteht darin, dass dadurch auch der zum Speichern des Werts erforderliche Speicherplatz verringert werden kann. Insbesondere erfordern 6 Bytes für eine Genauigkeit von weniger als 3, 7 Bytes für eine Genauigkeit von 3 oder 4 und alle anderen Genauigkeiten 8 Bytes. Beachten Sie jedoch, dass das erste Byte zum Speichern der Genauigkeit verwendet wird, sodass der tatsächliche Wert die hier angegebene Speichergröße plus 1 zusätzliches Byte zum Speichern der Genauigkeit ist.