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

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

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

Wenn Sie eine Zeit konvertieren Wert auf datetime , werden dem Wert zusätzliche Informationen hinzugefügt. Das liegt daran, dass datetime Datentyp enthält sowohl Datums- als auch Zeitinformationen. Die Zeit Datentyp hingegen enthält nur Zeitinformationen. Daher werden dem Wert Datumsinformationen hinzugefügt, wenn Sie eine solche Konvertierung durchführen. Insbesondere wird das Datum auf „1900-01-01“ 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 time bis datetime .

DECLARE @thetime time
SET @thetime = '23:15:59.004007'
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetime) AS 'datetime';

Ergebnis:

+------------------+-------------------------+
| time             | datetime                |
|------------------+-------------------------|
| 23:15:59.0040070 | 1900-01-01 23:15:59.003 |
+------------------+-------------------------+

Wenn Sie von Zeit konvertieren bis datetime , wird die Datumskomponente auf 1900-01-01 gesetzt .

Beachten Sie auch, dass der Zeitwert selbst bei diesen beiden Datentypen unterschiedlich dargestellt wird. Die Zeit Datentyp fügt am Ende eine Null hinzu (weil er eine höhere Genauigkeit hat – seine Standardskalierung ist 7). Andererseits datetime Werte verwenden eine niedrigere Skala und werden auf Schritte von 0,000, 0,003 oder 0,007 Sekunden gerundet. Wenn Sie dies als problematisch empfinden, ziehen Sie eine Konvertierung in datetime2 in Betracht stattdessen.

Beispiel 2 – Niedrigere Genauigkeit/Maßstab

Im vorherigen Beispiel die Zeit value hatte eine höhere Sekundenbruchteilgenauigkeit als datetime Wert. Dies liegt daran, dass eine Standardskala von 7 verwendet wird. Wir können dies jedoch bei Bedarf auf einen niedrigeren Wert ändern.

Nur um es klar zu sagen, skaliert ist die Anzahl der Stellen rechts vom Dezimalkomma einer Zahl. Präzision ist die Gesamtzahl der Stellen in der Zahl. Wir können die Skala spezifizieren, indem wir eine Zahl in Klammern an den Datentyp anhängen.

Folgendes passiert, wenn ich die Zeit explizit festlege Wert einen niedrigeren Wert haben Skalierung als datetime Wert.

DECLARE @thetime time(0)
SET @thetime = '23:15:59.004007'
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetime) AS 'datetime';

Ergebnis:

+----------+-------------------------+
| time     | datetime                |
|----------+-------------------------|
| 23:15:59 | 1900-01-01 23:15:59.000 |
+----------+-------------------------+

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 @thetime time
SET @thetime = '23:15:59.004007'
SELECT 
  @thetime AS 'time',
  CONVERT(datetime, @thetime) AS 'datetime';

Ergebnis:

+------------------+-------------------------+
| time             | datetime                |
|------------------+-------------------------|
| 23:15:59.0040070 | 1900-01-01 23:15:59.003 |
+------------------+-------------------------+

Beispiel 4 – Implizite Konvertierung

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

DECLARE @thetime time, @thedatetime datetime
SET @thetime = '23:15:59.004007'
SET @thedatetime = @thetime
SELECT 
  @thetime AS 'time',
  @thedatetime AS 'datetime';

Ergebnis:

+------------------+-------------------------+
| time             | datetime                |
|------------------+-------------------------|
| 23:15:59.0040070 | 1900-01-01 23:15:59.003 |
+------------------+-------------------------+

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, die Zeit zuzuweisen Wert zu einem datetime Variable.

Beispiel 5 – Datum ändern

Wenn Sie das Datum ändern müssen (aber die gleiche Zeit beibehalten), können Sie DATEADD() verwenden Funktion.

DECLARE @thetime time, @thedatetime datetime
SET @thetime = '23:15:59.004007'
SET @thedatetime = @thetime
SET @thedatetime = DATEADD(year, 120, @thedatetime)
SELECT 
  @thetime AS 'time',
  @thedatetime AS 'datetime';

Ergebnis:

+------------------+-------------------------+
| time             | datetime                |
|------------------+-------------------------|
| 23:15:59.0040070 | 2020-01-01 23:15:59.003 |
+------------------+-------------------------+

In diesem Fall füge ich 120 zum Jahreswert hinzu, was 2020 ergibt.