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

Beispiele für die Konvertierung von „smalldatetime“ in „datetime“ in SQL Server (T-SQL)

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

Beim Konvertieren einer smalldatetime Wert auf datetime , die Stunden und Minuten werden kopiert und die Sekunden und Sekundenbruchteile werden auf 0 gesetzt .

Beispiel 1 – 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 von smalldatetime bis datetime .

DECLARE @thesmalldatetime smalldatetime
SET @thesmalldatetime = '2031-03-25 11:15:29'
SELECT 
  @thesmalldatetime AS 'thesmalldatetime',
  CAST(@thesmalldatetime AS datetime) AS 'datetime';

Ergebnis:

+---------------------+-------------------------+
| thesmalldatetime    | datetime                |
|---------------------+-------------------------|
| 2031-03-25 11:15:00 | 2031-03-25 11:15:00.000 |
+---------------------+-------------------------+

Erstens können wir sehen, dass thesmalldatetime Wert verwendet 00 für die Sekundenkomponente, obwohl wir sie explizit auf 29 gesetzt haben . Dies liegt daran, dass bei Verwendung von thesmalldatetime Datentyp sind die Sekunden immer null (und ohne Sekundenbruchteile).

Daher konvertieren wir den Wert in datetime , werden der Sekundenwert (und Sekundenbruchteile) auf Null gesetzt. Hätten wir gerade datetime den ursprünglichen Wert zugewiesen an erster Stelle wären die Sekunden erhalten geblieben:

DECLARE @thedatetime datetime
SET @thedatetime = '2031-03-25 11:15:29'
SELECT @thedatetime AS 'thedatetime';

Ergebnis:

+-------------------------+
| thedatetime             |
|-------------------------|
| 2031-03-25 11:15:29.000 |
+-------------------------+

Nicht nur die Sekunden wären intakt geblieben, sondern auch alle Sekundenbruchteile wären intakt geblieben (aber nur bis zu einer Skala von 3):

DECLARE @thedatetime datetime
SET @thedatetime = '2031-03-25 11:15:29.123'
SELECT @thedatetime AS 'thedatetime';

Ergebnis:

+-------------------------+
| thedatetime             |
|-------------------------|
| 2031-03-25 11:15:29.123 |
+-------------------------+

Beispiel 2 – Rundung

Folgendes passiert, wenn wir die Sekundenkomponente auf einen höheren Wert setzen, bevor wir sie smalldatetime zuweisen Datentyp.

DECLARE @thesmalldatetime smalldatetime
SET @thesmalldatetime = '2031-03-25 11:15:31'
SELECT 
  @thesmalldatetime AS 'thesmalldatetime',
  CAST(@thesmalldatetime AS datetime) AS 'datetime';

Ergebnis:

+---------------------+-------------------------+
| thesmalldatetime    | datetime                |
|---------------------+-------------------------|
| 2031-03-25 11:16:00 | 2031-03-25 11:16:00.000 |
+---------------------+-------------------------+

Daher wird die Minutenkomponente jetzt auf die nächste Minute aufgerundet.

Beispiel 3 – Explizite Konvertierung mit CONVERT()

Dies ist dasselbe wie im ersten Beispiel, außer dass ich diesmal CONVERT() verwende Funktion anstelle von CAST() .

DECLARE @thesmalldatetime smalldatetime
SET @thesmalldatetime = '2031-03-25 11:15:29'
SELECT 
  @thesmalldatetime AS 'thesmalldatetime',
  CONVERT(datetime, @thesmalldatetime) AS 'datetime';

Ergebnis:

+---------------------+-------------------------+
| thesmalldatetime    | datetime                |
|---------------------+-------------------------|
| 2031-03-25 11:15:00 | 2031-03-25 11:15:00.000 |
+---------------------+-------------------------+

Beispiel 4 – Implizite Konvertierung

Hier ist ein Beispiel dafür, wie Sie dasselbe tun, aber eine implizite Typkonvertierung verwenden.

DECLARE @thesmalldatetime smalldatetime, @thedatetime datetime
SET @thesmalldatetime = '2031-03-25 11:15:29'
SET @thedatetime = @thesmalldatetime
SELECT 
  @thesmalldatetime AS 'thesmalldatetime',
  @thedatetime AS 'datetime';

Ergebnis:

+---------------------+-------------------------+
| thesmalldatetime    | datetime                |
|---------------------+-------------------------|
| 2031-03-25 11:15:00 | 2031-03-25 11:15:00.000 |
+---------------------+-------------------------+

Wir erhalten also dasselbe Ergebnis, unabhängig davon, ob es sich um eine explizite oder implizite Konvertierung handelt.

Dies ist eine implizite Konvertierung, da wir keine Konvertierungsfunktion verwenden, um sie explizit zu konvertieren. Wir weisen einfach den Wert einer Variablen eines Datentyps einer Variablen eines anderen Datentyps zu. In diesem Fall führt SQL Server im Hintergrund eine implizite Konvertierung durch, wenn wir versuchen, smalldatetime zuzuweisen Wert zu einem datetime Variable.