Dit artikel bevat voorbeelden van het converteren van een tijd waarde naar een datetime waarde in SQL Server.
Wanneer u een tijd . omrekent waarde tot datetime , wordt er extra informatie aan de waarde toegevoegd. Dit komt omdat de datetime gegevenstype bevat zowel datum- als tijdinformatie. De tijd gegevenstype daarentegen bevat alleen tijdinformatie. Daarom wordt datuminformatie toegevoegd aan de waarde wanneer u een dergelijke conversie uitvoert. De datum is specifiek ingesteld op '1900-01-01'.
Voorbeeld 1 – Expliciete conversie met CAST()
Hier is een voorbeeld van een expliciete conversie. In dit geval gebruik ik de CAST()
functie direct binnen de SELECT
statement om expliciet te converteren van tijd tot datetime .
DECLARE @thetime time SET @thetime = '23:15:59.004007' SELECT @thetime AS 'time', CAST(@thetime AS datetime) AS 'datetime';
Resultaat:
+------------------+-------------------------+ | time | datetime | |------------------+-------------------------| | 23:15:59.0040070 | 1900-01-01 23:15:59.003 | +------------------+-------------------------+
Wanneer u converteert vanaf tijd tot datetime , de datumcomponent is ingesteld op 1900-01-01
.
Merk ook op dat de tijdwaarde zelf in beide gegevenstypen anders wordt weergegeven. De tijd gegevenstype voegt een nul toe aan het einde (omdat het een hogere precisie heeft - de standaardschaal is 7). Aan de andere kant, datetime waarden gebruiken een lagere schaal en worden afgerond op stappen van .000, .003 of .007 seconden. Als je dit problematisch vindt, overweeg dan om te converteren naar datetime2 in plaats van.
Voorbeeld 2 – Lagere precisie/schaal
In het vorige voorbeeld is de tijd waarde had een hogere fractionele seconden precisie dan de datetime waarde. Dit komt omdat het een standaardschaal van 7 gebruikt. Maar we kunnen dit desgewenst wijzigen in een lagere waarde.
Voor alle duidelijkheid:schaal is het aantal cijfers rechts van de komma in een getal. Precisie is het totale aantal cijfers in het getal. We kunnen de schaal specificeren door een getal tussen haakjes toe te voegen aan het gegevenstype.
Dit gebeurt er als ik de tijd expliciet instel waarde om een lagere . te hebben schaal dan de datetime waarde.
DECLARE @thetime time(0) SET @thetime = '23:15:59.004007' SELECT @thetime AS 'time', CAST(@thetime AS datetime) AS 'datetime';
Resultaat:
+----------+-------------------------+ | time | datetime | |----------+-------------------------| | 23:15:59 | 1900-01-01 23:15:59.000 | +----------+-------------------------+
Voorbeeld 3 – Expliciete conversie met CONVERT()
Dit is hetzelfde als het eerste voorbeeld, behalve dat ik deze keer de CONVERT()
. gebruik functie in plaats van CAST()
.
DECLARE @thetime time SET @thetime = '23:15:59.004007' SELECT @thetime AS 'time', CONVERT(datetime, @thetime) AS 'datetime';
Resultaat:
+------------------+-------------------------+ | time | datetime | |------------------+-------------------------| | 23:15:59.0040070 | 1900-01-01 23:15:59.003 | +------------------+-------------------------+
Voorbeeld 4 – Impliciete conversie
Hier is een voorbeeld van hetzelfde doen, maar met een impliciete typeconversie.
DECLARE @thetime time, @thedatetime datetime SET @thetime = '23:15:59.004007' SET @thedatetime = @thetime SELECT @thetime AS 'time', @thedatetime AS 'datetime';
Resultaat:
+------------------+-------------------------+ | time | datetime | |------------------+-------------------------| | 23:15:59.0040070 | 1900-01-01 23:15:59.003 | +------------------+-------------------------+
We krijgen dus hetzelfde resultaat, of het nu een expliciete of impliciete conversie is.
Dit is een impliciete conversie omdat we geen conversiefunctie gebruiken om deze expliciet te converteren. We wijzen eenvoudigweg de waarde van een variabele van het ene gegevenstype toe aan een variabele van een ander gegevenstype. In dit geval voert SQL Server achter de schermen een impliciete conversie uit wanneer we proberen de tijd toe te wijzen waarde naar een datetime variabel.
Voorbeeld 5 – Wijzig de datum
Als u de datum wilt wijzigen (maar dezelfde tijd aanhoudt), kunt u de DATEADD()
gebruiken functie.
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';
Resultaat:
+------------------+-------------------------+ | time | datetime | |------------------+-------------------------| | 23:15:59.0040070 | 2020-01-01 23:15:59.003 | +------------------+-------------------------+
In dit geval tel ik 120 op bij de jaarwaarde, wat het op 2020 brengt.