Dit artikel bevat voorbeelden van het converteren van een datum waarde toe aan een datetime2 waarde in SQL Server.
Wanneer u een datum converteert waarde tot datetime2 , wordt er extra informatie aan de waarde toegevoegd. Dit komt omdat de datetime2 gegevenstype bevat zowel datum- als tijdinformatie. De datum gegevenstype daarentegen bevat alleen datuminformatie.
De datetime2 gegevenstype is in feite een uitbreiding van de datetime data type. Het heeft een groter datumbereik, een grotere standaard fractionele precisie en optionele door de gebruiker gespecificeerde precisie.
In ieder geval is het conversieproces precies hetzelfde, ongeacht het gegevenstype. Het enige verschil is de hoeveelheid informatie die beschikbaar is tussen datum , datumtijd en datetime2 .
Voorbeeld 1 – Impliciete conversie
Hier is een voorbeeld van een impliciete conversie tussen datum en datetime2 .
DECLARE @thedate date, @thedatetime2 datetime2 SET @thedate = '2020-12-01' SET @thedatetime2 = @thedate SELECT @thedate AS 'date', @thedatetime2 AS 'datetime2';
Resultaat:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 | +------------+-----------------------------+
Dit is een impliciete conversie omdat we geen conversiefunctie (zoals hieronder) gebruiken om deze expliciet te converteren. In dit geval voert SQL Server achter de schermen een impliciete conversie uit wanneer we proberen de datum toe te wijzen waarde toe aan een datetime2 variabel.
We kunnen zien dat de datum variabele bevat alleen datuminformatie, terwijl de datetime2 variabele bevat zowel datum- als tijdinformatie.
Bovendien krijgen we meer tijdinformatie dan we zouden krijgen als we deze zouden omzetten naar de datetime gegevenstype.
Wanneer u converteert tussen datum en datetime2 met de standaardprecisie (7) wordt de tijdcomponent ingesteld op 00:00:00.0000000
(vergeleken met 00:00:00.000
voor datetime ). U kunt de precisie desgewenst verminderen (zie hieronder). Het verminderen van de precisie kan ook de hoeveelheid ruimte verminderen die nodig is om de waarde op te slaan.
De reden dat de tijdcomponent allemaal nullen is, is omdat de datumwaarde geen tijdinformatie bevat, dus SQL Server kan op geen enkele manier weten welke tijd u wilt (indien aanwezig).
Voorbeeld 2 – Wijzig de tijd
Als u een tijd moet opgeven (maar dezelfde datum wilt behouden), kunt u de DATEADD()
gebruiken functie om precies dat te doen.
DECLARE @thedate date, @thedatetime2 datetime2 SET @thedate = '2020-12-01' SET @thedatetime2 = @thedate SET @thedatetime2 = DATEADD(hour, 8, @thedatetime2) SELECT @thedate AS 'date', @thedatetime2 AS 'datetime2';
Resultaat:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 08:00:00.0000000 | +------------+-----------------------------+
Voorbeeld 3 – 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 tussen datum en datetime2 .
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CAST(@thedate AS datetime2) AS 'datetime2';
Resultaat:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 | +------------+-----------------------------+
We krijgen dus hetzelfde resultaat als de impliciete conversie.
We kunnen de tijd ook als volgt aanpassen:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(hour, 8, CAST(@thedate AS datetime2)) AS 'datetime2';
Resultaat:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 08:00:00.0000000 | +------------+-----------------------------+
Voorbeeld 4 – Expliciete conversie met CONVERT()
Hier is een voorbeeld van een expliciete conversie met de CONVERT()
functie in plaats van CAST()
.
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CONVERT(datetime2, @thedate) AS 'datetime2';
Resultaat:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 | +------------+-----------------------------+
En de tijd aanpassen:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(hour, 8, CONVERT(datetime2, @thedate)) AS 'datetime2';
Resultaat:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 08:00:00.0000000 | +------------+-----------------------------+
Voorbeeld 5 – Precisie
De datetime2 gegevenstype kunt u de precisie specificeren (tot de standaard 7). Met andere woorden, u hoeft niet de volledige 7 cijfers te gebruiken als dat niet nodig is.
Voorbeeld:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CONVERT(datetime2(2), @thedate) AS 'datetime2(2)', CONVERT(datetime2(4), @thedate) AS 'datetime2(4)';
Resultaat:
+------------+------------------------+--------------------------+ | date | datetime2(2) | datetime2(4) | |------------+------------------------+--------------------------| | 2020-12-01 | 2020-12-01 00:00:00.00 | 2020-12-01 00:00:00.0000 | +------------+------------------------+--------------------------+
Een voordeel van het verminderen van de precisie is dat het ook de hoeveelheid ruimte kan verminderen die nodig is om de waarde op te slaan. In het bijzonder 6 bytes voor precisie minder dan 3, 7 bytes voor precisie 3 of 4, en alle andere precisie vereisen 8 bytes. Houd er echter rekening mee dat de eerste byte wordt gebruikt om de precisie op te slaan, dus de werkelijke waarde is de opslaggrootte die hier wordt aangegeven plus 1 extra byte om de precisie op te slaan.