Denne artikel indeholder eksempler på konvertering af en dato værdi til en datotidsforskydning værdi i SQL Server.
Når du konverterer en dato værdi til datetimeoffset , tilføjes ekstra information til værdien. Dette skyldes, at datetime offset datatypen indeholder både dato- og klokkeslætsinformation samt information om tidsforskydning. Med andre ord, datetime offset datatype definerer en dato, der er kombineret med et klokkeslæt på en dag, der har tidszonebevidsthed og er baseret på et 24-timers ur. datoen datatype indeholder på den anden side kun datooplysninger.
Når vi konverterer fra dato til datotidsforskydning , lægges tiden (og tidszoneforskydningen) automatisk til værdien. Du kan dog altid ændre værdien, hvis det er nødvendigt (inklusive tidszoneforskydningen).
datetime offset datatype giver dig også mulighed for at angive brøksekunders præcision. Hvis du ikke angiver dette, bruger den en skala fra 7. Det betyder, at den vil inkludere 7 cifre på højre side af decimaltegnet.
Eksempel 1 – Implicit konvertering
Her er et eksempel på en implicit konvertering mellem dato og datotidsforskydning .
DECLARE @thedate date, @thedatetimeoffset datetimeoffset(7) SET @thedate = '2020-12-01' SET @thedatetimeoffset = @thedate SELECT @thedate AS 'date', @thedatetimeoffset AS 'datetimeoffset';
Resultat:
+------------+------------------------------------+ | date | datetimeoffset | |------------+------------------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 +00:00 | +------------+------------------------------------+
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 datotidsforskydning variabel.
Vi kan se, at datoen variabel indeholder kun datooplysninger, hvorimod datetime offset variabel indeholder oplysninger om dato, klokkeslæt og tidszoneforskydning.
Når du konverterer mellem dato og datetimeoffset(7) (dvs. ved at bruge en skala fra 7), sættes tidskomponenten til 00:00:00.0000000 +00:00
. Dette er også standardværdien, så du kan udelade præcisionsværdien, og den vil bruge en skala på 7 (hvilket resulterer i en præcision på 34). Du kan reducere præcisionen, hvis du foretrækker det. Reduktion af præcisionen kan også reducere mængden af plads, der kræves for at gemme værdien.
Bare for at være klar, skaler er antallet af cifre til højre for decimaltegnet i et tal. Nøjagtighed er det samlede antal cifre i tallet.
Eksempel 2 – 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 datotidsforskydning .
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CAST(@thedate AS datetimeoffset) AS 'datetimeoffset';
Resultat:
+------------+------------------------------------+ | date | datetimeoffset | |------------+------------------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 +00:00 | +------------+------------------------------------+
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, 7, CAST(@thedate AS datetimeoffset)) AS 'datetimeoffset';
Resultat:
+------------+------------------------------------+ | date | datetimeoffset | |------------+------------------------------------| | 2020-12-01 | 2020-12-01 07:00:00.0000000 +00:00 | +------------+------------------------------------+
Bemærk, at du ikke kan bruge DATEADD()
funktion til at ændre tidsforskydningskomponenten. Men bare rolig, der er en måde at ændre det på (læs videre for at finde ud af hvordan).
Eksempel 3 – 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(datetimeoffset, @thedate) AS 'datetimeoffset';
Resultat:
+------------+------------------------------------+ | date | datetimeoffset | |------------+------------------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 +00:00 | +------------+------------------------------------+
Og justering af tiden:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(hour, 7, CONVERT(datetimeoffset, @thedate)) AS 'datetimeoffset';
Resultat:
+------------+------------------------------------+ | date | datetimeoffset | |------------+------------------------------------| | 2020-12-01 | 2020-12-01 07:00:00.0000000 +00:00 | +------------+------------------------------------+
Eksempel 4 – Rediger tidsforskydningen
I de foregående eksempler brugte vi DATEADD()
funktion til at ændre tidsværdien. Denne funktion kan bruges til at ændre enhver del af dato- eller tidskomponenten, undtagen tidsforskydningskomponenten .
Hvis du har brug for at ændre tidsforskydningen, kan du bruge TODATETIMEOFFSET()
fungere. Du kan også bruge denne funktion til at konvertere den oprindelige dato værdi til en datotidsforskydning værdi. Denne funktion accepterer en datoværdi (der kan omdannes til en datetime2 værdi), og en offsetværdi.
Her er et eksempel:
DECLARE @thedate date, @thedatetimeoffset datetimeoffset SET @thedate = '2020-12-01' SET @thedatetimeoffset = TODATETIMEOFFSET(@thedate, '+07:00') SELECT @thedate AS 'date', @thedatetimeoffset AS 'datetimeoffset';
Resultat:
+------------+------------------------------------+ | date | datetimeoffset | |------------+------------------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 +07:00 | +------------+------------------------------------+
Og her er et eksempel, der bruger funktionen i SELECT
erklæring:
DECLARE @thedate date = '2020-12-01' SELECT @thedate AS 'date', TODATETIMEOFFSET(@thedate, '+07:00') AS 'datetimeoffset';
Resultat:
+------------+------------------------------------+ | date | datetimeoffset | |------------+------------------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 +07:00 | +------------+------------------------------------+
TODATETIMEOFFSET()
funktionen accepterer også en datotidsforskydning værdi som dens første parameter, så du kan også bruge den til at ændre eksisterende datetime offset værdier, hvis det kræves.
Eksempel:
DECLARE @thedate date, @thedatetimeoffset datetimeoffset(7) SET @thedate = '2020-12-01' SET @thedatetimeoffset = @thedate SELECT @thedate AS 'date', @thedatetimeoffset AS 'datetimeoffset', TODATETIMEOFFSET(@thedatetimeoffset, '+07:00') AS 'Modified';
Resultat:
+------------+------------------------------------+------------------------------------+ | date | datetimeoffset | Modified | |------------+------------------------------------+------------------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 +00:00 | 2020-12-01 00:00:00.0000000 +07:00 | +------------+------------------------------------+------------------------------------+