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

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

Wenn Sie einen datetimeoffset haben -Wert, aber Sie brauchen den Offset-Teil für Datum und Zeitzone nicht, um ihn in time 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 einer Zeit 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. Seine Genauigkeit beträgt 100 Nanosekunden.

Die Zeit Der Datentyp enthält dagegen nur die Uhrzeit. Es enthält weder das Datum noch den Zeitzonenoffset. Allerdings ähnlich wie bei datetimeoffset Sie können auch einen Sekundenbruchteil zwischen 0 und 7 angeben (indem Sie time(n) verwenden). Syntax). Es verwendet entweder 3, 4 oder 5 Bytes, abhängig von seiner Genauigkeit.

Beim Konvertieren eines datetimeoffset Wert zu einer Zeit Datentyp, verlieren Sie den Datumsteil. Sie verlieren auch den Zeitzonenoffset. Sie reduzieren jedoch auch die Speichergröße von 8 bis 10 Byte auf 3, 4 oder 5 Byte. Sie würden diese Konvertierung jedoch nur durchführen, wenn Sie den Datumsteil oder den Zeitzonenoffset nicht benötigen.

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. Daher müssen Sie 1 Byte zu den hier aufgeführten Beträgen hinzufügen.

Beispiel 1 – Implizite Konvertierung

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

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

Ergebnis:

+------------------------------------+------------------+
| datetimeoffset                     | time             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 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 einer Zeit Variable.

Hier sehen wir die Zeit Der Wert enthält nur die Zeit (ohne die Datumskomponente). Die Offset-Komponenten für Datum und Zeitzone wurden aus dem Wert entfernt.

In diesem Beispiel verwenden beide Datentypen die Standardgenauigkeit (was zu 7 Dezimalstellen führt). Daraus ergibt sich der datetimeoffset Wert mit 10 Bytes und der Zeit Wert mit 5 Bytes.

Beispiel 2 – Präzision

Das genaue Ergebnis hängt von den Genauigkeitseinstellungen für jeden Datentyp ab. Im nächsten Beispiel die Zeit value verwendet eine geringere Genauigkeit als das ursprüngliche datetimeoffset Wert:

DECLARE 
  @thedatetimeoffset datetimeoffset(7), 
  @thetime time(3);
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30';
SET @thetime = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thetime AS 'time';

Ergebnis:

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

Mein System zeigt nachgestellte Nullen an, aber der Punkt ist, dass die Zeit Der Wert hat jetzt eine Genauigkeit von nur 3 Dezimalstellen im Vergleich zu den 7 Dezimalstellen, die der ursprüngliche Wert verwendet.

Eine Verringerung der Genauigkeit kann auch zu einer Zeit führen Wert wird aufgerundet. Hier ist ein Beispiel:

DECLARE 
  @thedatetimeoffset datetimeoffset(7), 
  @thetime time(3);
SET @thedatetimeoffset = '2025-05-21 10:15:30.1235555 +10:30';
SET @thetime = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thetime AS 'time';

Ergebnis:

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

In diesem Fall erhalten wir am Ende einen Bruchteil von 124 statt 123 , weil die folgende Ziffer 5 oder größer war.

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

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

Ergebnis:

+------------------------------------+------------------+
| datetimeoffset                     | date             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 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 +10:30';
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  CONVERT(time, @thedatetimeoffset) AS 'time'; 

Ergebnis:

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