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

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

Wenn Sie einen datetimeoffset haben -Wert, aber Sie brauchen den Zeit- und Zeitzonen-Offset-Teil nicht, um ihn in date umzuwandeln spart Ihnen viel Speicherplatz (während unnötige Details aus dem Wert entfernt werden). Dieser Artikel enthält Beispiele für die Konvertierung eines datetimeoffset Wert zu einem Datum Wert in SQL Server.

Der datetimeoffset Der Datentyp enthält das Datum und die Uhrzeit mit einem Zeitzonenoffset. Es hat auch einen Sekundenbruchteil zwischen 0 und 7 (dies hängt davon ab, wie viele Sekundenbruchteile ihm zugewiesen sind). Dies geschieht durch Verwendung von datetimeoffset(n) Syntax. Wenn Sie dies nicht angeben, wird 7 (Standard) verwendet. Die Speichergröße dieses Datentyps beträgt je nach verwendeter Genauigkeit entweder 8, 9 oder 10 Byte (plus 1 Byte zum Speichern der Genauigkeit). Seine Genauigkeit beträgt 100 Nanosekunden.

Das Datum Datentyp hingegen enthält nur das Datum. Es enthält keine Uhrzeit und hat eine Genauigkeit von 1 Tag. Es verwendet 3 Bytes für die Speicherung.

Beim Konvertieren eines datetimeoffset Wert zu einem Datum Datentyp verlieren Sie den Zeitteil (einschließlich des Zeitzonen-Offsets). Allerdings reduzieren Sie damit auch die Speichergröße auf feste 3 Byte. Natürlich würden Sie diese Konvertierung nur durchführen, wenn Sie den Zeitabschnitt und den Zeitzonenoffset nicht benötigen.

Beispiel 1 – Implizite Konvertierung

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

DECLARE 
  @thedatetimeoffset datetimeoffset, 
  @thedate date;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30';
SET @thedate = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thedate AS 'date';

Ergebnis:

+------------------------------------+------------+
| datetimeoffset                     | date       |
|------------------------------------+------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 |
+------------------------------------+------------+

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

Hier sehen wir das Datum Der Wert enthält nur das Datum (ohne die Zeitkomponente). Die Zeitkomponente, einschließlich ihres Zeitzonen-Offsets, wurde aus dem Wert entfernt.

In diesem Beispiel das datetimeoffset value verwendet die Standardgenauigkeit (was zu 7 Dezimalstellen führt). Dies führt dazu, dass der Datentyp 10 Bytes verwendet (eigentlich 11 Bytes, wenn Sie das zusätzliche Byte zählen, das die Genauigkeit speichert). Das Datum value verwendet nur 3 Bytes.

Beispiel 2 – 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 Datum .

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

Ergebnis:

+------------------------------------+------------+
| datetimeoffset                     | date       |
|------------------------------------+------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 |
+------------------------------------+------------+

Beispiel 3 – 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 +10:30';
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  CONVERT(date, @thedatetimeoffset) AS 'date';

Ergebnis:

+------------------------------------+------------+
| datetimeoffset                     | date       |
|------------------------------------+------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 |
+------------------------------------+------------+