Den här artikeln innehåller exempel på hur du konverterar en datumtidsförskjutning värde till datetime2 i SQL Server.
När du konverterar en datumtidsförskjutning värde till datetime2 , kopieras datum och tid till datetime2 värde och tidszonen trunkeras. Bråksekunderna trunkeras också för att passa om destinationsprecisionen är lägre.
datetimeoffset datatyp låter dig specificera en bråkdelssekunderprecision från 0 till 7 genom att använda datetimeoffset(n)
syntax. Om du inte anger detta kommer den att använda 7 (standard). Den har också en tidszonförskjutning. Den här datatypens lagringsstorlek är antingen 8, 9 eller 10 byte, beroende på vilken precision som används.
datetime2 datatypen låter dig också ange en bråkdelssekundersprecision från 0 till 7 (med datetime2(n)
syntax). Den har ingen tidszonsmedvetenhet. Dess lagringsstorlek är antingen 6, 7 eller 8, beroende på vilken precision som används.
Observera att lagringsbeloppen som anges här är de belopp som anges i Microsofts dokumentation. Dessa datatyper använder dock också 1 byte för att lagra precisionen. Lägg därför till 1 byte till beloppen som anges här för en mer komplett bild av lagringskraven.
Exempel 1 – Implicit konvertering
Här är ett exempel på en implicit konvertering mellan datetimeoffset och datetime2 .
DECLARE @thedatetimeoffset datetimeoffset, @thedatetime2 datetime2;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SET @thedatetime2 =@thedatetimeoffset;SELECT @thedatetimetime2set', 'datetimeoffset', 'date AS 'datetime2';
Resultat:
+--------------------------------------------+-------- --------------------+| datetimeoffset | datetime2 ||---------------------------------------------+---------------- ------------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.1234567 |+-------------------------------------------+- ----------------------------+
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 datetimeoffset värde till en datetime2 variabel.
I det här exemplet använder båda datatyperna standardprecisionen (7 decimaler). Därför var bråkdelen 1234567 för båda resultaten.
Vi ser också att tidszonförskjutningen trunkerades – datetime2 datatypen har ingen tidszonsmedvetenhet.
I den här konverteringen har lagringsstorleken minskat från 10 byte (för datetimeoffset ) till 8 byte (för datetime2 ), men notera att 1 byte läggs till för att lagra precisionen.
Exempel 2 – Annan precision
Här är ett exempel som visar vad som händer om datetime2 värde använder en lägre precision än datumtidsförskjutningen värde.
DECLARE @thedatetimeoffset datetimeoffset(7), @thedatetime2 datetime2(3);SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SET @thedatetime2 =@thedatetimeoffset;SELECT AS @thedatetimeoffset 'datetimeoffset', @thedatetime2 AS 'datetime2';
Resultat:
+--------------------------------------------+-------- ----------------+| datetimeoffset | datetime2 ||---------------------------------------------+---------------- ---------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 |+-------------------------------------------+- ------------------------+
I det här exemplet är datetimeoffset har en skala på 7
men datetime2 värde har en skala på bara 3
. Därför trunkerades bråksekunderna för att passa.
Observera att detta kan orsaka avrundning. Här är ett exempel där bråkdelen av datetime2 värdet avrundas uppåt till 124 .
DECLARE @thedatetimeoffset datetimeoffset(7), @thedatetime2 datetime2(3);SET @thedatetimeoffset ='2025-05-21 10:15:30.1235555 +07:00';SET @thedatetime2 =@thedatetimeoffset;SELECT AS @thedatetimeoffset 'datetimeoffset', @thedatetime2 AS 'datetime2';
Resultat:
+--------------------------------------------+-------- ----------------+| datetimeoffset | datetime2 ||---------------------------------------------+---------------- ---------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.124 |+-------------------------------------------+- ------------------------+
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 datetimeoffset och datetime2 .
DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SELECT @thedatetimeoffset AS 'datetimeoffset', CAST(@thedatetimeoffset AS datetime2) AS 'datetime2 /pre>Resultat:
+--------------------------------------------+-------- --------------------+| datetimeoffset | datetime2 ||---------------------------------------------+---------------- ------------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.1234567 |+-------------------------------------------+- ----------------------------+Exempel 4 – Explicit konvertering med CONVERT()
Här är ett exempel på en explicit konvertering med
CONVERT()
funktion istället förCAST()
.DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SELECT @thedatetimeoffset AS 'datetimeoffset', CONVERT(datetime2, @thedatetimeoffset') AS 'datetime2 /pre>Resultat:
+--------------------------------------------+-------- --------------------+| datetimeoffset | datetime2 ||---------------------------------------------+---------------- ------------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.1234567 |+-------------------------------------------+- ----------------------------+