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

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

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

Einer der Vorteile der Konvertierung einer datetime Wert zu Zeit besteht darin, dass Sie die Speichergröße von 8 Byte auf entweder 3, 4 oder 5 Byte reduzieren (abhängig von der Genauigkeit, die Sie für die Zeit verwenden Wert). Genau genommen Zeit verwendet 4, 5 oder 6 Bytes, da ein zusätzliches Byte verwendet wird, um seine Genauigkeit zu speichern.

Beim Konvertieren einer datetime Wert zu Zeit , wird nur der Zeitteil des Werts kopiert. Das genaue Ergebnis hängt von der Sekundenbruchteilgenauigkeit ab, die Sie time zuweisen . Wenn die Zeit Die Genauigkeit ist kleiner als datetime Präzision, die Sekundenbruchteile werden auf die Zeit aufgerundet Präzision.

Die datetime Der Datentyp hat maximal 3 Ziffern für seinen Sekundenbruchteil. Die Genauigkeit wird auf 0,000, 0,003 oder 0,007 Sekunden gerundet.

Die Zeit Der Datentyp hingegen ermöglicht es Ihnen, eine Genauigkeit von Sekundenbruchteilen von 0 bis 7 anzugeben. Dies wird durch die Verwendung von time(n erreicht ) Syntax, wobei n ist die Skala von 0 bis 7. Wenn Sie dies nicht angeben, wird 7 verwendet, was eine Genauigkeit von 100 Nanosekunden bietet.

Beispiel 1 – Implizite Konvertierung

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

DECLARE 
  @thedatetime datetime, 
  @thetime time;
SET @thedatetime = '2025-05-21 10:15:30.123';
SET @thetime = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thetime AS 'time';

Ergebnis:

+-------------------------+------------------+
| datetime                | time             |
|-------------------------+------------------|
| 2025-05-21 10:15:30.123 | 10:15:30.1233333 |
+-------------------------+------------------+

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, datetime 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.

Wir können das auch die Zeit sehen Variable hat eine höhere Genauigkeit in Sekundenbruchteilen, und wir erhalten am Ende einen Bruchteil von 1233333 (gegenüber 123 für die datetime Wert). Dies geschieht, weil die Zeit value verwendet die Standardskala von 7 (weil wir keine Skala explizit angegeben haben).

Beispiel 2 – Rundung

Die datetime Der Datentyp wird auf Schritte von 0,000, 0,003 oder 0,007 Sekunden gerundet. Auch wenn Sie ihn explizit auf einen anderen Wert setzen, wird er gerundet.

Hier ist ein Beispiel:

DECLARE 
  @thedatetime datetime, 
  @thetime time;
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thetime = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thetime AS 'thetime';

Ergebnis:

+-------------------------+------------------+
| datetime                | thetime          |
|-------------------------+------------------|
| 2025-05-21 10:15:30.127 | 10:15:30.1266667 |
+-------------------------+------------------+

In diesem Beispiel setze ich die Sekundenbruchteile auf 125 sondern datetime aufgerundet auf 127 (da nur auf 0,000, 0,003 oder 0,007 Sekunden gerundet werden kann).

Die Zeit Stellen Sie die Sekundenbruchteile jedoch auf 1266667 ein .

Wenn wir den Anfangswert einfach auf time setzen würden an erster Stelle hätte sein Bruchteil 1250000 zurückgegeben .

Beispiel 3 – Präzision/Genauigkeit

Wie gesagt, die Zeit Mit dem Datentyp können Sie die Genauigkeit von Sekundenbruchteilen angeben. Wenn Sie dies nicht tun, wird 7 verwendet (deshalb verwendet das vorherige Beispiel 7).

Sie können dies ändern, indem Sie die time(n ) Syntax. Daher hätte ich time(7) verwenden können damit die vorherigen Beispiele dasselbe Ergebnis erhalten.

In diesem Beispiel entferne ich die Sekundenbruchteile vollständig, indem ich time(0) verwende :

DECLARE 
  @thedatetime datetime, 
  @thetime time(0);
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thetime = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thetime AS 'time';

Ergebnis:

+-------------------------+----------+
| datetime                | time     |
|-------------------------+----------|
| 2025-05-21 10:15:30.127 | 10:15:30 |
+-------------------------+----------+

Dabei wird die Speichergröße der Zeit Der Wert wird auf 3 Bytes (4 Bytes einschließlich Genauigkeit) im Gegensatz zu 8 Bytes für datetime reduziert Wert.

Beachten Sie, dass die Verwendung einer niedrigeren Genauigkeit als des ursprünglichen Werts dazu führt, dass das Ergebnis auf die angegebene Genauigkeit aufgerundet wird.

Beispiel:

DECLARE 
  @thedatetime datetime, 
  @thetime time(0);
SET @thedatetime = '2025-05-21 10:15:30.525';
SET @thetime = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thetime AS 'time';

Ergebnis:

+-------------------------+----------+
| datetime                | time     |
|-------------------------+----------|
| 2025-05-21 10:15:30.527 | 10:15:31 |
+-------------------------+----------+

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 datetime zu konvertieren und Zeit .

DECLARE @thedatetime datetime;
SET @thedatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thedatetime AS 'datetime',
  CAST(@thedatetime AS time(0)) AS 'time(0)';

Ergebnis:

+-------------------------+-----------+
| datetime                | time(0)   |
|-------------------------+-----------|
| 2025-05-21 10:15:30.127 | 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 @thedatetime datetime;
SET @thedatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thedatetime AS 'datetime',
  CONVERT(time(0), @thedatetime) AS 'time(0)';

Ergebnis:

+-------------------------+-----------+
| datetime                | time(0)   |
|-------------------------+-----------|
| 2025-05-21 10:15:30.127 | 10:15:30  |
+-------------------------+-----------+