Denne artikel indeholder eksempler på konvertering af en dato værdi til en datetime2 værdi i SQL Server.
Når du konverterer en dato værdi til datetime2 , tilføjes ekstra information til værdien. Dette skyldes, at datetime2 datatypen indeholder både dato- og tidsinformation. datoen datatype indeholder på den anden side kun datooplysninger.
datetime2 datatypen er dybest set en udvidelse af datetime datatype. Den har et større datointerval, en større standard brøkpræcision og valgfri brugerspecificeret præcision.
Under alle omstændigheder er konverteringsprocessen nøjagtig den samme uanset datatypen. Den eneste forskel er mængden af information, der er tilgængelig mellem dato , datotid og datetime2 .
Eksempel 1 – Implicit konvertering
Her er et eksempel på en implicit konvertering mellem dato og datetime2 .
DECLARE @thedate date, @thedatetime2 datetime2 SET @thedate = '2020-12-01' SET @thedatetime2 = @thedate SELECT @thedate AS 'date', @thedatetime2 AS 'datetime2';
Resultat:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 | +------------+-----------------------------+
Dette er en implicit konvertering, fordi vi ikke bruger en konverteringsfunktion (som dem nedenfor) til eksplicit at konvertere den. I dette tilfælde udfører SQL Server en implicit konvertering bag kulisserne, når vi forsøger at tildele datoen værdi til en datetime2 variabel.
Vi kan se, at datoen variabel indeholder kun datooplysninger, hvorimod datetime2 variabel indeholder både dato og klokkeslæt.
Desuden får vi flere tidsoplysninger, end vi ville få, hvis vi konverterede det til datetime datatype.
Når du konverterer mellem dato og datetime2 ved at bruge standardpræcisionen (7) sættes tidskomponenten til 00:00:00.0000000
(sammenlignet med 00:00:00.000
for datotid ). Du kan reducere præcisionen, hvis du foretrækker det (se nedenfor). Reduktion af præcisionen kan også reducere mængden af plads, der kræves for at gemme værdien.
Grunden til, at tidskomponenten kun er nuller, er, at datoværdien ikke indeholder nogen tidsinformation, så der er ingen måde for SQL Server at vide, hvad tid du ønsker (hvis nogen).
Eksempel 2 – Rediger klokkeslættet
Hvis du har brug for at angive et klokkeslæt (men beholde den samme dato), kan du bruge DATEADD()
funktion til at gøre netop det.
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';
Resultat:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 08:00:00.0000000 | +------------+-----------------------------+
Eksempel 3 – Eksplicit konvertering ved hjælp af CAST()
Her er et eksempel på en eksplicit konvertering. I dette tilfælde bruger jeg CAST()
funktion direkte i SELECT
erklæring om eksplicit at konvertere mellem dato og datetime2 .
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CAST(@thedate AS datetime2) AS 'datetime2';
Resultat:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 | +------------+-----------------------------+
Så vi får det samme resultat som den implicitte konvertering.
Vi kan også justere tiden sådan her:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(hour, 8, CAST(@thedate AS datetime2)) AS 'datetime2';
Resultat:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 08:00:00.0000000 | +------------+-----------------------------+
Eksempel 4 – Eksplicit konvertering ved hjælp af CONVERT()
Her er et eksempel på en eksplicit konvertering ved hjælp af CONVERT()
funktion i stedet for CAST()
.
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CONVERT(datetime2, @thedate) AS 'datetime2';
Resultat:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 | +------------+-----------------------------+
Og justering af tiden:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(hour, 8, CONVERT(datetime2, @thedate)) AS 'datetime2';
Resultat:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 08:00:00.0000000 | +------------+-----------------------------+
Eksempel 5 – Præcision
datetime2 datatype giver dig mulighed for at angive præcisionen (op til standard 7). Med andre ord behøver du ikke bruge de fulde 7 cifre, hvis du ikke har brug for det.
Eksempel:
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)';
Resultat:
+------------+------------------------+--------------------------+ | date | datetime2(2) | datetime2(4) | |------------+------------------------+--------------------------| | 2020-12-01 | 2020-12-01 00:00:00.00 | 2020-12-01 00:00:00.0000 | +------------+------------------------+--------------------------+
En fordel ved at reducere præcisionen er, at det også kan reducere mængden af plads, der kræves for at gemme værdien. Især 6 bytes for præcision mindre end 3, 7 bytes for præcision 3 eller 4, og al anden præcision kræver 8 bytes. Bemærk dog, at den første byte bruges til at gemme præcisionen, så den faktiske værdi er lagerstørrelsen angivet her plus 1 ekstra byte til at gemme præcisionen.