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

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

Dieser Artikel enthält Beispiele für die Konvertierung von datetime2 Wert zu einer Zeit Wert in SQL Server.

Einer der Vorteile der Konvertierung von datetime2 Wert zu Zeit besteht darin, dass Sie die Speichergröße von 6 bis 8 Byte auf 3 bis 5 Byte reduzieren (abhängig von der Genauigkeit, die jedem Datentyp zugewiesen wurde). Genau genommen wird 1 zusätzliches Byte verwendet, um die Genauigkeit für diese Datentypen zu speichern, also sollten Sie 1 Byte zu diesen Mengen hinzufügen.

Natürlich geht der Datumsteil während der Konvertierung verloren, aber Sie würden diese Konvertierung nicht durchführen, wenn Sie den Datumsteil beibehalten müssten.

Beim Konvertieren eines datetime2 Wert zu Zeit , wird nur der Zeitteil des Werts kopiert. Das genaue Ergebnis hängt von der Sekundenbruchteilgenauigkeit ab, die jedem Typ zugewiesen ist. Wenn die Zeit Die Genauigkeit ist kleiner als datetime2 Präzision, die Sekundenbruchteile werden auf die Zeit aufgerundet Präzision.

In Bezug auf die Genauigkeit können Sie bei beiden Datentypen eine Skalierung von 0 Dezimalstellen bis 7 angeben. Dadurch haben Sie die Möglichkeit, die Umrechnung durchzuführen, ohne Sekundenbruchteile zu verlieren oder das Ergebnis aufrunden zu lassen.

Beispiel 1 – Implizite Konvertierung

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

DECLARE @thedatetime2 datetime2, @thetime time;SET @thedatetime2 ='2025-05-21 10:15:30.1234567';SET @thetime =@thedatetime2;SELECT @thedatetime2 AS 'datetime2', @thetime AS 'time';

Ergebnis:

+-------------------------------------+---------------- --+| datumzeit2 | Zeit ||------------------------+---------------- -|| 2025-05-21 10:15:30.1234567 | 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, datetime2 zuzuweisen Wert zu einer Zeit Variable.

Das offensichtlichste an diesem Ergebnis ist, dass die Zeit Der Wert enthält nicht das Datum. Das ist zu erwarten, denn die Zeit Der Datentyp dient ausschließlich zum Speichern von Zeitwerten, nicht von Datumswerten.

Außerdem verwenden in diesem Beispiel beide Datentypen ihre Standardgenauigkeit (die eine Skala von 7 ist). Das bedeutet, dass die Zeit Der Wert endet mit der gleichen Genauigkeit wie datetime2 Wert. Der Grund, warum ich weiß, dass sie ihre Standardpräzision verwenden, ist, dass ich bei der Deklaration keine Bruchsekundenskala angegeben habe.

Beispiel 2 – Konvertieren in eine höhere Genauigkeit

In diesem Beispiel die Zeit Variable verwendet eine höhere Genauigkeit als datetime2 Variable.

DECLARE @thedatetime2 datetime2(4), @thetime time(7);SET @thedatetime2 ='2025-05-21 10:15:30.1234567';SET @thetime =@thedatetime2;SELECT @thedatetime2 AS 'datetime2', @thetime AS 'Zeit';

Ergebnis:

+---------------------+------------------+ | datumzeit2 | Zeit ||---------------------+------------------|| 2025-05-21 10:15:30.1235 | 10:15:30.1235000 |+---------------------+---------------- --+

In diesem Fall datetime2 Variable verwendet eine Skala von 4 und die Zeit Variable verwendet 7.

Dies ergibt datetime2 die Sekundenbruchteile aufrunden, so erhalten wir 1235 statt 1234 . Es bedeutet auch, dass wir es in Zeit umwandeln , endet der Wert mit 3 nachgestellten Nullen (weil wir eine Skala von 7 angegeben haben). Das bedeutet auch, dass die Zeit Die Speichergröße von value beträgt 5 Bytes (6 einschließlich Genauigkeit) im Vergleich zu 4 Bytes (5 einschließlich Genauigkeit), wenn wir ihm eine Skalierung von 4 gegeben hätten.

Beispiel 3 – Konvertieren in eine niedrigere Genauigkeit

In diesem Beispiel die Zeit Variable verwendet eine geringere Genauigkeit als datetime2 Variable.

DECLARE @thedatetime2 datetime2(7), @thetime time(0);SET @thedatetime2 ='2025-05-21 10:15:30.5678912';SET @thetime =@thedatetime2;SELECT @thedatetime2 AS 'datetime2', @thetime AS 'Zeit';

Ergebnis:

+-------------------------------------+----------+| datumzeit2 | Zeit ||------------------------+----------|| 2025-05-21 10:15:30.5678912 | 10:15:31 |+----------------------------------------+----------+ 

Also in diesem Fall Zeit ’s Skala wird auf 0 reduziert, was bedeutet, dass keine Sekundenbruchteile im Ergebnis enthalten sind. Auch die Sekunden werden entsprechend aufgerundet.

Die Zeit Der Wert verwendet 4 Byte Speicherplatz (einschließlich Genauigkeit), verglichen mit 9 Byte für datetime2 Wert (und verglichen mit 6 Bytes für die Zeit Wert im vorherigen Beispiel).

Beispiel 4 – 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, um explizit zwischen datetime2 zu konvertieren und Zeit .

DECLARE @thedatetime2 datetime2(3);SET @thedatetime2 ='2025-05-21 10:15:30.123';SELECT @thedatetime2 AS 'datetime2', CAST(@thedatetime2 AS time(0)) AS 'time( 0)';

Ergebnis:

+--------------------+-----------+| datumzeit2 | Zeit(0) ||--------------------+-----------|| 2025-05-21 10:15:30.123 | 10:15:30 |+--------------------+-----------+

Beispiel 5 – Explizite Konvertierung mit CONVERT()

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

DECLARE @thedatetime2 datetime2(3);SET @thedatetime2 ='2025-05-21 10:15:30.123';SELECT @thedatetime2 AS 'datetime2', CONVERT(time(0), @thedatetime2) AS 'time( 0)';

Ergebnis:

+--------------------+-----------+| datumzeit2 | Zeit(0) ||--------------------+-----------|| 2025-05-21 10:15:30.123 | 10:15:30 |+--------------------+-----------+