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

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

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

Beim Konvertieren einer datetime Wert auf datetimeoffset , hängt der resultierende Wert von der Genauigkeit in Sekundenbruchteilen ab, die Sie datetimeoffset zuweisen , sowie alle von Ihnen angegebenen Zeitzonen-Offsets.

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.

Der datetimeoffset Der Datentyp hingegen ermöglicht es Ihnen, eine Genauigkeit von Sekundenbruchteilen von 0 bis 7 anzugeben. Wenn Sie dies nicht angeben, wird 7 (Standardeinstellung) verwendet. Es hat auch einen Zeitzonen-Offset und kann alle Offsets im ursprünglichen Wert beibehalten. Allerdings datetime hat kein Zeitzonenbewusstsein, daher müssen keine vorhandenen Werte beibehalten werden. In diesem Fall ist der Zeitzonenoffset standardmäßig +00:00.

SQL Server hat tatsächlich den TODATETIMEOFFSET() -Funktion, die speziell dafür entwickelt wurde, einen Datums-/Uhrzeitwert in datetimeoffset umzuwandeln und fügen Sie einen Zeitzonenoffset hinzu. Bei der Verwendung dieser Funktion ist jedoch ein subtiles Detail zu beachten, das ich unten (mit Beispielen) erkläre.

Beispiel 1 – Implizite Konvertierung

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

DECLARE 
  @thedatetime datetime, 
  @thedatetimeoffset datetimeoffset(7);
SET @thedatetime = '2025-05-21 10:15:30.123';
SET @thedatetimeoffset = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetimeoffset AS 'datetimeoffset(7)';

Ergebnis:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.123 | 2025-05-21 10:15:30.1233333 +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, datetime zuzuweisen Wert zu einem datetimeoffset Variable.

Das sehen wir am datetimeoffset 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). Außerdem erhalten wir einen Zeitzonenversatz von +00:00 .

Die Verwendung einer Genauigkeit von 7 Sekundenbruchteilen verursacht datetimeoffset um 10 Bytes für die Speicherung zu verwenden (11 Bytes, wenn Sie das Byte einbeziehen, das seine Genauigkeit speichert). Zum Vergleich datetime verwendet nur 8 Bytes. Sie können jedoch die Genauigkeit des datetimeoffset verringern Wert, indem Sie die 7 durch eine niedrigere Zahl ersetzen. Dies ist dasselbe Konzept wie bei der Verwendung von datetime2 Datentyp. Siehe „datetime“ in „datetime2“ in SQL Server umwandeln für Beispiele, wie sich dies auf das Endergebnis auswirken kann.

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. Dies könnte Sie sehr verwirren, 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, 
  @thedatetimeoffset datetimeoffset;
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thedatetimeoffset = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetimeoffset AS 'datetimeoffset(7)';

Ergebnis:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 |
+-------------------------+------------------------------------+

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

Der datetimeoffset setzen Sie andererseits die Sekundenbruchteile auf 1266667 .

Wenn wir den Anfangswert jedoch einfach auf datetimeoffset setzen würden an erster Stelle hätte sein Bruchteil 1250000 zurückgegeben .

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 datetime zu konvertieren und datetimeoffset .

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

Ergebnis:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 |
+-------------------------+------------------------------------+

Beispiel 4 – 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(datetimeoffset(7), @thedatetime) AS 'datetimeoffset(7)';

Ergebnis:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 |
+-------------------------+------------------------------------+

Beispiel 5 – Ändern des Zeitzonen-Offsets

Wenn Sie sich die Mühe machen, Ihre datetime umzuwandeln Werte zu datetimeoffset , benötigen Sie wahrscheinlich den Zeitzonenoffset. Und es ist sehr wahrscheinlich, dass Sie es auf etwas anderes als +00:00 einstellen möchten.

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

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

Hier ist ein Beispiel:

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

Ergebnis:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1270000 +07:00 |
+-------------------------+------------------------------------+

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

DECLARE @thedatetime datetime = '2025-05-21 10:15:30.125';
SELECT 
  @thedatetime AS 'datetime',
  TODATETIMEOFFSET(@thedatetime, '+07:00') AS 'datetimeoffset';

Ergebnis:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1270000 +07:00 |
+-------------------------+------------------------------------+

Ein wichtiger Punkt zum TODATETIMEOFFSET() Funktion ist, dass sie die gleiche gebrochene Genauigkeit verwendet wie das an sie übergebene Datum/Uhrzeit-Argument. In diesem Fall ist es ein datetime Argument, also hat es eine Skala von 3 (dh 3 Sekundenbruchteile). Dies kann für Sie ein Problem sein oder auch nicht. Wenn dies der Fall ist, können Sie es jederzeit in ein datetimeoffset umwandeln Übergeben Sie zuerst diesen konvertierten Wert an TODATETIMEOFFSET() .

Beispiel:

DECLARE @thedatetime datetime, @thedatetimeoffset datetimeoffset(7);
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thedatetimeoffset = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetimeoffset AS 'datetimeoffset',
  TODATETIMEOFFSET(@thedatetimeoffset, '+07:00') AS 'Modified';

Ergebnis (bei vertikaler Ausgabe):

datetime       | 2025-05-21 10:15:30.127
datetimeoffset | 2025-05-21 10:15:30.1266667 +00:00
Modified       | 2025-05-21 10:15:30.1266667 +07:00