Den här artikeln innehåller exempel på hur du konverterar en datumtid värde till en datetimeoffset värde i SQL Server.
När du konverterar en datumtid värde till datetimeoffset , kommer det resulterande värdet att bero på bråksekundersprecisionen som du tilldelar datetimeoffset , samt eventuell tidszonförskjutning som du anger.
datetime datatypen har högst 3 siffror för sin del av bråkdelssekunder. Dess noggrannhet är avrundad till steg om 0,000, 0,003 eller 0,007 sekunder.
datetimeoffset datatyp, å andra sidan, låter dig ange en bråkdelssekunderprecision från 0 till 7. Om du inte anger detta kommer den att använda 7 (standard). Den har också en tidszonförskjutning och kan bevara alla förskjutningar i det ursprungliga värdet. Men datumtid har ingen tidszonsmedvetenhet, så det finns inga befintliga värden att bevara. I det här fallet är tidszonsförskjutningen som standard +00:00.
SQL Server har faktiskt TODATETIMEOFFSET()
funktion, som är speciellt utformad för att konvertera ett datum-/tidsvärde till datetimeoffset och lägg till en tidszonsförskjutning. Det finns dock en subtil detalj att vara medveten om när du använder den här funktionen, och jag förklarar detta nedan (med exempel).
Exempel 1 – Implicit konvertering
Först, här är ett exempel på en implicit konvertering mellan datetime och datumtidsförskjutning .
DECLARE @thedatetime datetime, @thedatetimeoffset datetimeoffset(7);SET @thedatetime ='2025-05-21 10:15:30.123';SET @thedatetimeoffset =@thedatetime;SELECT @thedatetime AS 'datetime', @thedatetimeoffset AS 'datetimeoffset(7)';
Resultat:
+------------------------+------------------------ ----------------+| datetime | datetimeoffset(7) ||------------------------+------------------------ ------------------|| 2025-05-21 10:15:30.123 | 2025-05-21 10:15:30.1233333 +00:00 |+--------------------------------+-------- ----------------------------+
Detta är en implicit konvertering eftersom vi inte använder en konverteringsfunktion (som de nedan) för att explicit konvertera den. I det här fallet utför SQL Server en implicit konvertering bakom kulisserna när vi försöker tilldela datetime värde till en datetimeoffset variabel.
Vi kan se att datetimeoffset variabel har mer bråksekundersprecision, och vi slutar med en bråkdel av 1233333 (mot 123 för datetime värde). Vi slutar också med en tidszonförskjutning på +00:00 .
Att använda 7 bråksekundersprecision orsakar datumtidsförskjutning att använda 10 byte för lagring (11 byte om du inkluderar byten som lagrar dess precision). Som jämförelse, datetime använder endast 8 byte. Du kan dock minska precisionen för datetimeoffset värde genom att ersätta 7:an med ett lägre nummer. Detta är samma koncept som när du använder datetime2 data typ. Se Konvertera 'datetime' till 'datetime2' i SQL Server för exempel på hur detta kan påverka slutresultatet.
Exempel 2 – Avrundning
datetime datatypen avrundas till steg om 0,000, 0,003 eller 0,007 sekunder. Även om du uttryckligen ställer in det till ett annat värde, kommer det att avrundas. Detta kan orsaka dig mycket förvirring om du inte är medveten om hur det fungerar. Det kan inte bara orsaka förvirring när du använder datetime i sig kan det skapa extra förvirring när värdet konverteras till en annan datatyp.
Här är ett exempel som visar vad jag menar.
DECLARE @thedatetime datetime, @thedatetimeoffset datetimeoffset;SET @thedatetime ='2025-05-21 10:15:30.125';SET @thedatetimeoffset =@thedatetime;SELECT @thedatetime AS 'datetime', @thedatetimeoffset AS 'datetimeoffset( 7)';
Resultat:
+------------------------+------------------------ ----------------+| datetime | datetimeoffset(7) ||------------------------+------------------------ ------------------|| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 |+--------------------------------+-------- ----------------------------+
I det här exemplet satte jag bråksekunderna till 125
men datumtid rundade det upp till
127
(eftersom denna datatyp endast kan avrundas till steg om 0,000, 0,003 eller 0,007 sekunder).
datetimeoffset värde å andra sidan, ställ in bråkdelssekunder till 1266667 .
Men om vi helt enkelt skulle ställa in det initiala värdet till datetimeoffset i första hand skulle dess bråkdel ha returnerat 1250000 .
Exempel 3 – Explicit konvertering med CAST()
Här är ett exempel på en explicit konvertering. I det här fallet använder jag CAST()
funktion direkt inom SELECT
uttalande för att uttryckligen konvertera mellan datetime och datumtidsförskjutning .
DECLARE @thedatetime datetime;SET @thedatetime ='2025-05-21 10:15:30.125';SELECT @thedatetime AS 'datetime', CAST(@thedatetime AS datetimeoffset(7)) AS 'datetimeoffset(7)';
Resultat:
+------------------------+------------------------ ----------------+| datetime | datetimeoffset(7) ||------------------------+------------------------ ------------------|| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 |+--------------------------------+-------- ----------------------------+
Exempel 4 – Explicit konvertering med CONVERT()
Här är ett exempel på en explicit konvertering med CONVERT()
funktion istället för CAST()
.
DECLARE @thedatetime datetime;SET @thedatetime ='2025-05-21 10:15:30.125';SELECT @thedatetime AS 'datetime', CONVERT(datetimeoffset(7), @thedatetime) AS 'datetimeoffset(7)';
Resultat:
+------------------------+------------------------ ----------------+| datetime | datetimeoffset(7) ||------------------------+------------------------ ------------------|| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 |+--------------------------------+-------- ----------------------------+
Exempel 5 – Ändra tidszonförskjutningen
Om du går in i alla problem med att konvertera din datumtid värden till datetimeoffset , behöver du förmodligen tidszonsförskjutningen. Och det finns en stor möjlighet att du vill ha den inställd på något annat än +00:00.
Lyckligtvis kan du använda TODATETIMEOFFSET()
funktion för att ändra offset.
Du kan också använda den här funktionen för att konvertera den ursprungliga datetime värde till en datetimeoffset värde. Den här funktionen accepterar ett datum/tid-värde (som kan lösas till ett datetime2 värde), och ett offsetvärde.
Här är ett exempel:
DECLARE @thedatetime datetime, @thedatetimeoffset datetimeoffset;SET @thedatetime ='2025-05-21 10:15:30.125';SET @thedatetimeoffset =TODATETIMEOFFSET(@thedatetime, '+07:00');SELECT @thedatetime AS 'datetime', @thedatetimeoffset AS 'datetimeoffset';
Resultat:
+------------------------+------------------------ ----------------+| datetime | datetimeoffset(7) ||------------------------+------------------------ ------------------|| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1270000 +07:00 |+--------------------------------+-------- ----------------------------+
Och här är ett exempel med funktionen i SELECT
uttalande:
DECLARE @thedatetime datetime ='2025-05-21 10:15:30.125';VÄLJ @thedatetime SOM 'datetime', TODATETIMEOFFSET(@thedatetime, '+07:00') AS 'datetimeoffset';
Resultat:
+------------------------+------------------------ ----------------+| datetime | datetimeoffset(7) ||------------------------+------------------------ ------------------|| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1270000 +07:00 |+--------------------------------+-------- ----------------------------+
En viktig punkt om TODATETIMEOFFSET()
funktion är att den använder samma bråkdelprecision som datum/tid-argumentet som skickas till den. I det här fallet är det en datumtid argument, så det har en skala på 3 (dvs. 3 bråkdelar). Detta kan eller kanske inte är ett problem för dig. Om det är det kan du alltid konvertera det till en datumtidsförskjutning först, skicka sedan det konverterade värdet till TODATETIMEOFFSET()
.
Exempel:
DECLARE @thedatetime datetime, @thedatetimeoffset datetimeoffset(7);SET @thedatetime ='2025-05-21 10:15:30.125';SET @thedatetimeoffset =@thedatetime;SELECT @thedatetime AS 'datetime', @thedatetimeoffset AS 'datetimeoffset', TODATETIMEOFFSET(@thedatetimeoffset, '+07:00') SOM 'Ändrad';
Resultat (med vertikal utdata):