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

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

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

Beim Konvertieren eines datetimeoffset Wert auf datetime2 , werden Datum und Uhrzeit in datetime2 kopiert Wert, und die Zeitzone wird abgeschnitten. Die Bruchteile von Sekunden werden auch abgeschnitten, um zu passen, wenn die Zielgenauigkeit niedriger ist.

Der datetimeoffset Der Datentyp ermöglicht es Ihnen, eine Genauigkeit von Sekundenbruchteilen von 0 bis 7 anzugeben, indem Sie datetimeoffset(n) verwenden 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 Byte.

Die datetime2 Der Datentyp ermöglicht es Ihnen auch, eine Genauigkeit von 0 bis 7 in Sekundenbruchteilen anzugeben (unter Verwendung von datetime2(n) Syntax). Es hat kein Zeitzonenbewusstsein. Seine Speichergröße beträgt entweder 6, 7 oder 8, je nach verwendeter Genauigkeit.

Beachten Sie, dass es sich bei den hier aufgeführten Speichermengen um die in der Microsoft-Dokumentation aufgeführten Mengen handelt. Diese Datentypen verwenden jedoch auch 1 Byte, um die Genauigkeit zu speichern. Fügen Sie daher 1 Byte zu den hier aufgeführten Mengen hinzu, um ein vollständigeres Bild der Speicheranforderungen zu erhalten.

Beispiel 1 – Implizite Konvertierung

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

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

Ergebnis:

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

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 datetime2 Variable.

In diesem Beispiel verwenden beide Datentypen die Standardgenauigkeit (7 Dezimalstellen). Daher war der Bruchteil 1234567 für beide Ergebnisse.

Wir sehen auch, dass der Zeitzonenoffset abgeschnitten wurde – das datetime2 Datentyp kennt keine Zeitzone.

Bei dieser Konvertierung hat sich die Speichergröße von 10 Byte verringert (für datetimeoffset ) auf 8 Bytes (für datetime2 ), beachten Sie jedoch, dass 1 Byte hinzugefügt wird, um die Genauigkeit zu speichern.

Beispiel 2 – Unterschiedliche Präzision

Hier ist ein Beispiel, das zeigt, was passiert, wenn datetime2 value verwendet eine geringere Genauigkeit als datetimeoffset Wert.

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

Ergebnis:

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

In diesem Beispiel das datetimeoffset hat eine Skala von 7 aber die datetime2 value hat eine Skalierung von nur 3 . Daher wurden die Sekundenbruchteile passend gekürzt.

Beachten Sie, dass dies zu Rundungen führen kann. Hier ist ein Beispiel, in dem der Bruchteil von datetime2 Der Wert wird auf 124 aufgerundet .

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

Ergebnis:

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

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 datetime2 .

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

Ergebnis:

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

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(datetime2, @thedatetimeoffset) AS 'datetime2';

Ergebnis:

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