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

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

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

Beim Konvertieren einer smalldatetime Wert zu Zeit , verlieren Sie das Datum. Die Stunden, Minuten und Sekunden werden kopiert. Die Sekundenbruchteile werden auf 0 gesetzt.

Die smalldatetime Der Datentyp enthält sowohl das Datum als auch die Uhrzeit. Die Zeit hat jedoch keine Bruchteile von Sekunden, und ihre Sekundenkomponente ist immer auf Null (:00) gesetzt. Seine Genauigkeit ist minutengenau. Seine Speichergröße beträgt 4 Bytes.

Die Zeit Der Datentyp enthält dagegen nur die Uhrzeit. Sie können jedoch eine Sekundenbruchteilgenauigkeit von 0 bis 7 angeben. 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 (Standardeinstellung) verwendet, was eine Genauigkeit von 100 Nanosekunden bietet. Wenn Sie Null angeben (0 ), seine Genauigkeit wird auf die nächste Sekunde sein. Seine Speichergröße beträgt entweder 3, 4 oder 5 Byte (plus 1 Byte zum Speichern der Genauigkeit), abhängig von der Genauigkeit in Sekundenbruchteilen.

Beispiel 1 – Implizite Konvertierung

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

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thetime time;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thetime = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thetime AS 'time';

Ergebnis:

+---------------------+----------+
| smalldatetime       | time     |
|---------------------+----------|
| 2025-05-21 10:16:00 | 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, smalldatetime 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.

Was ist nicht Offensichtlich (zumindest bei meinem Beispiel) ist, dass der Zeitwert tatsächlich einen Sekundenbruchteil verarbeiten kann. Mein System zeigt hier keine Sekundenbruchteile an, aber das nächste Beispiel zeigt, dass es tatsächlich eine Genauigkeit von 7 Sekundenbruchteilen hat.

Wenn Sie genau hinsehen, werden Sie außerdem das smalldatetime sehen value rundete die Minuten ab dem tatsächlichen Wert auf, den ich ihm zuweisen wollte. Dies spiegelt die relativ geringe Genauigkeit von smalldatetime wider Datentyp. Seine Präzision ist minutengenau. Die offensichtliche Folge davon ist, dass wir seinen Wert schließlich der Zeit neu zuweisen Datentyp, es ist der aufgerundete Wert, der zugewiesen wird – nicht der anfängliche Wert, den ich zuzuweisen versucht habe. Wenn wir den Anfangswert direkt der Zeit zugewiesen hätten Variable hätten wir einen genaueren Wert erhalten (selbst wenn wir eine Skala von 0 angegeben hätten).

Folgendes meine ich:

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thetime time(0);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thetime = '2025-05-21 10:15:30';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thetime AS 'time';

Ergebnis:

+---------------------+----------+
| smalldatetime       | time     |
|---------------------+----------|
| 2025-05-21 10:16:00 | 10:15:30 |
+---------------------+----------+

Beispiel 2 – Hinzufügen von Sekundenbruchteilen

Die smalldatetime Der Datentyp hat keinen Sekundenbruchteil, sondern in unserem ersten Beispiel die Zeit Der Wert hat eine Genauigkeit von 7 Sekundenbruchteilen (obwohl er eigentlich keine Dezimalstellen anzeigt). Ich kenne seine Genauigkeit, weil ich beim Deklarieren keine Skala angegeben habe, daher verwendet es seine Standardskala von 7.

Hier ist ein Beispiel, um zu bestätigen, dass die Zeit Wert kann tatsächlich einen Bruchteil unterstützen:

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thetime time;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thetime = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thetime AS 'Original time',
  DATEADD(nanosecond, 123456700, @thetime) AS 'Modified time';

Ergebnis:

+---------------------+-----------------+------------------+
| smalldatetime       | Original time   | Modified time    |
|---------------------+-----------------+------------------|
| 2025-05-21 10:16:00 | 10:16:00        | 10:16:00.1234567 |
+---------------------+-----------------+------------------+

Beachten Sie, dass wenn die Zeit value hat eine Skalierung von 7, er hat eine Speichergröße von 5 Bytes. Daher hat es höhere Speicheranforderungen als smalldatetime Typ (der nur 4 Bytes verwendet).

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

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

Ergebnis:

+---------------------+-----------+
| smalldatetime       | time(0)   |
|---------------------+-----------|
| 2025-05-21 10:16:00 | 10:16:00  |
+---------------------+-----------+

In diesem Beispiel habe ich die Skalierung auf 0 gesetzt.

Beispiel 4 – Explizite Konvertierung mit CONVERT()

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

DECLARE @thesmalldatetime smalldatetime;
SET @thesmalldatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  CONVERT(time(0), @thesmalldatetime) AS 'time(0)';

Ergebnis:

+---------------------+-----------+
| smalldatetime       | time(0)   |
|---------------------+-----------|
| 2025-05-21 10:16:00 | 10:16:00  |
+---------------------+-----------+