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

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

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

Beim Konvertieren eines datetimeoffset Wert auf smalldatetime , das Datum und die Stunden werden kopiert. Die Minuten werden aufgerundet (abhängig vom Sekundenwert) und die Sekunden auf 0 gesetzt.

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 Byte (plus 1 Byte für die Genauigkeit).

Die smalldatetime Der Datentyp hingegen hat keine Zeitzonenerkennung und enthält daher keinen Zeitzonenoffset. Es hat auch keine Sekundenbruchteile, und seine Sekundenkomponente ist immer auf Null (:00) gesetzt. Seine Genauigkeit ist minutengenau. Die Speichergröße dieses Datentyps ist auf 4 Byte festgelegt.

Beispiel 1 – Implizite Konvertierung

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

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

Ergebnis:

+------------------------------------+---------------------+
| datetimeoffset                     | smalldatetime       |
|------------------------------------+---------------------|
| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:16: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, das datetimeoffset zuzuweisen Wert auf smalldatetime Variable.

Wir können sehen, dass die smalldatetime Die Variable hat keine Sekundenbruchteilgenauigkeit, und ihre Sekunden wurden auf Null gesetzt. Außerdem wurden die Minuten aufgerundet, da der ursprüngliche Wert einen Sekundenwert von 30 hatte.

Eine weitere Beobachtung ist, dass der Zeitzonenoffset abgeschnitten wurde – die smalldatetime Datentyp kennt keine Zeitzone.

Bei dieser Konvertierung hat sich die Speichergröße von 10 Byte (11 Byte, wenn Sie die Genauigkeit zählen) für datetimeoffset verringert , auf 4 Bytes für smalldatetime .

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

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

Ergebnis:

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

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 +07:00';
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  CONVERT(smalldatetime, @thedatetimeoffset) AS 'smalldatetime';

Ergebnis:

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