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

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

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

Beim Konvertieren eines datetime2 Wert auf datetimeoffset , hängt der resultierende Wert von der Genauigkeit in Sekundenbruchteilen ab, die jedem Datentyp zugewiesen ist, sowie von einem von Ihnen angegebenen Zeitzonen-Offset.

Bei beiden Datentypen können Sie eine Sekundenbruchteilgenauigkeit von 0 bis 7 angeben. Wenn Sie dies nicht angeben, wird die Standardskalierung von 7 verwendet.

Der datetimeoffset Der Datentyp enthält einen Zeitzonen-Offset und kann alle Offsets im ursprünglichen Wert beibehalten. Jedoch datetime2 hat kein Zeitzonenbewusstsein, daher müssen keine vorhandenen Werte beibehalten werden. In diesem Fall ist der Zeitzonenoffset standardmäßig +00:00.

Der TODATETIMEOFFSET() Die Funktion wurde speziell entwickelt, um einen Datums-/Uhrzeitwert in datetimeoffset umzuwandeln und fügen Sie einen Zeitzonenoffset hinzu. Beachten Sie jedoch meine Kommentare (und Beispiele) unten zu dieser Option.

Beispiel 1 – Implizite Konvertierung

Hier ist zunächst ein Beispiel für eine implizite Konvertierung zwischen datetime2 und datetimeoffset .

DECLARE 
  @thedatetime2 datetime2(7), 
  @thedatetimeoffset datetimeoffset(7);
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SET @thedatetimeoffset = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetimeoffset AS 'datetimeoffset(7)';

Ergebnis:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset(7)                  |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00:00 |
+-----------------------------+------------------------------------+

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, datetime2 zuzuweisen Wert zu einem datetimeoffset Variable.

Das sehen wir am datetimeoffset Variable kann die gleiche Genauigkeit wie datetime2 verwenden Wert (7 Dezimalstellen). Außerdem erhalten wir einen Zeitzonenversatz von +00:00 .

Die Verwendung einer Genauigkeit von 7 Sekundenbruchteilen verursacht datetimeoffset 11 Byte für die Speicherung zu verwenden (10 für die Daten und 1 Byte für die Genauigkeit). Die datetime2 Typ verwendet 9 Bytes (8 für die Daten und 1 Byte für die Genauigkeit), wenn eine Skala von 7 verwendet wird.

Sie können die Genauigkeit jedoch verringern, indem Sie die 7 durch eine niedrigere Zahl ersetzen.

Beispiel 2 – Rundung

Wenn datetimeoffset hat eine geringere Genauigkeit als datetime2 Wert, wird aufgerundet.

Hier ist ein Beispiel:

DECLARE 
  @thedatetime2 datetime2(7), 
  @thedatetimeoffset datetimeoffset(6);
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SET @thedatetimeoffset = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2(7)',
  @thedatetimeoffset AS 'datetimeoffset(6)';

Ergebnis:

+-----------------------------+------------------------------------+
| datetime2(7)                | datetimeoffset(6)                  |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234570 +00:00 |
+-----------------------------+------------------------------------+

In diesem Beispiel das datetime2 value hat eine Skala von 7, aber das datetimeoffset Die Skalierung des Werts beträgt nur 6. Daher beträgt seine Genauigkeit nur 6 Dezimalstellen, und seine sechste Stelle wird auf 7 (statt 6) aufgerundet.

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, um explizit zwischen datetime2 zu konvertieren und datetimeoffset .

DECLARE @thedatetime2 datetime2;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SELECT 
  @thedatetime2 AS 'datetime2',
  CAST(@thedatetime2 AS datetimeoffset) AS 'datetimeoffset';

Ergebnis:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset                     |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00:00 |
+-----------------------------+------------------------------------+

Beispiel 4 – Explizite Konvertierung mit CONVERT()

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

DECLARE @thedatetime2 datetime2;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SELECT 
  @thedatetime2 AS 'datetime2',
  CONVERT(datetimeoffset, @thedatetime2) AS 'datetimeoffset';

Ergebnis:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset                     |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00:00 |
+-----------------------------+------------------------------------+

Beispiel 5 – Ändern des Zeitzonen-Offsets

Wenn Sie von datetime2 konvertieren zu datetimeoffset , tun Sie es wahrscheinlich für den Zeitzonen-Offset. Es ist auch sehr wahrscheinlich, dass Sie einen anderen Wert als den Standardwert +00:00 benötigen.

Glücklicherweise können Sie TODATETIMEOFFSET() verwenden Funktion zum Ändern des Offsets.

Sie können diese Funktion auch verwenden, um das ursprüngliche datetime2 umzuwandeln Wert zu einem datetimeoffset Wert. Diese Funktion akzeptiert jeden Datums-/Uhrzeitwert, der zu datetime2 aufgelöst werden kann -Wert und einen Offset-Wert.

Hier ist ein Beispiel:

DECLARE @thedatetime2 datetime2, @thedatetimeoffset datetimeoffset;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SET @thedatetimeoffset = TODATETIMEOFFSET(@thedatetime2, '+07:00');
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetimeoffset AS 'datetimeoffset';

Ergebnis:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset                     |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +07:00 |
+-----------------------------+------------------------------------+

Und hier ist ein Beispiel für die Verwendung der Funktion innerhalb von SELECT Aussage:

DECLARE @thedatetime2 datetime2 = '2025-05-21 10:15:30.1234567';
SELECT 
  @thedatetime2 AS 'datetime2',
  TODATETIMEOFFSET(@thedatetime2, '+07:00') AS 'datetimeoffset';

Ergebnis:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset                     |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +07:00 |
+-----------------------------+------------------------------------+

Ein wichtiger Punkt zum TODATETIMEOFFSET() Funktion ist, dass sie die gleiche gebrochene Genauigkeit verwendet wie das an sie übergebene Datum/Uhrzeit-Argument.

Wenn also Ihre datetime2 verwendet eine niedrigere Genauigkeit als datetimeoffset , können Sie ihn jederzeit einer Variable mit höherer Genauigkeit neu zuweisen und diesen konvertierten Wert dann an TODATETIMEOFFSET() übergeben .

Beispiel:

DECLARE @lowprecision datetime2(3), @highprecision datetime2(7);
SET @lowprecision = '2025-05-21 10:15:30.123';
SET @highprecision = @lowprecision;
SELECT 
  @lowprecision AS 'lowprecision',
  @highprecision AS 'highprecision',
  TODATETIMEOFFSET(@highprecision, '+07:00') AS 'Modified';

Ergebnis (bei vertikaler Ausgabe):

lowprecision  | 2025-05-21 10:15:30.123
highprecision | 2025-05-21 10:15:30.1230000
Modified      | 2025-05-21 10:15:30.1230000 +07:00