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

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

Dieser Artikel enthält Beispiele für die Konvertierung eines datetimeoffset Wert auf datetime im SQL-Server.

Beim Konvertieren eines datetimeoffset Wert auf datetime , die Datums- und Uhrzeitwerte werden kopiert und der Zeitzonenoffset wird abgeschnitten. Wenn die gebrochene Genauigkeit von datetimeoffset Wert größer als drei Ziffern ist, wird der Wert abgeschnitten.

Der datetimeoffset Der Datentyp ermöglicht es Ihnen, eine Genauigkeit von 0 bis 7 Sekundenbruchteilen anzugeben. Dies geschieht durch Verwendung von datetimeoffset(n) Syntax. Wenn Sie dies nicht angeben, wird 7 (Standard) verwendet. Es hat auch einen Zeitzonen-Offset. Die Speichergröße dieses Datentyps beträgt je nach verwendeter Genauigkeit entweder 8, 9 oder 10 Bytes. Ein weiteres Byte wird verwendet, um die Genauigkeit zu speichern, also fügt dies 1 Byte zu diesen Zahlen hinzu.

Die datetime Der Datentyp hingegen hat maximal 3 Ziffern für seinen Sekundenbruchteil. Die Genauigkeit wird auf 0,000, 0,003 oder 0,007 Sekunden gerundet. Dieser Datentyp hat keine Zeitzonenerkennung und daher keinen Zeitzonenoffset. Seine Speichergröße beträgt 8 Bytes.

Beispiel 1 – Implizite Konvertierung

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

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

Ergebnis:

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

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

Wir können das datetime sehen Die Variable hat eine geringere Genauigkeit in Sekundenbruchteilen, und wir erhalten am Ende einen Bruchteil von 123 obwohl der ursprüngliche Bruchteil 1234567 war .

In diesem Fall wurde keine Rundung vorgenommen.

Wir sehen auch, dass der Zeitzonenoffset abgeschnitten wurde. Die datetime Datentyp kennt keine Zeitzone.

Bei dieser Konvertierung hat sich die Speichergröße von 10 Byte (11 Byte, wenn Sie das zusätzliche Byte zum Speichern der Genauigkeit einbeziehen) für datetimeoffset verringert , bis 8 Bytes für datetime . Wenn jedoch der datetimeoffset value eine Skala zwischen 0 und 2 verwendet hätte, hätte es nur 8 Bytes (9 einschließlich Genauigkeit) verwendet.

Wenn es eine Skala von 3 verwendet hätte (das Äquivalent von datetime Wert), wäre die Speichergröße 9 Bytes (10 mit Genauigkeit) gewesen. Seine Genauigkeit wäre jedoch höher gewesen als datetime . Natürlich würde die Genauigkeit abnehmen, sobald wir es in datetime umwandeln würden .

Beispiel 2 – Präzision/Genauigkeit und 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 gilt auch bei der Konvertierung von einem anderen Datentyp (wie wir es hier tun).

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

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

Ergebnis:

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

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

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 zum expliziten Konvertieren zwischen datetimeoffset und datetime .

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

Ergebnis:

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

Beispiel 4 – Explizite Konvertierung mit CONVERT()

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

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

Ergebnis:

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