sql >> Databasteknik >  >> RDS >> Sqlserver

Konvertera 'datetimeoffset' till 'datetime2' i SQL Server (T-SQL-exempel)

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ör CAST() .

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 |+-------------------------------------------+- ----------------------------+

  1. SQLite trigger

  2. Hur ändrar jag mysql till mysqli?

  3. Skapar en främmande nyckel automatiskt ett index?

  4. Hur får jag en kolumn med på varandra följande, ökande siffror, utan att några siffror saknas?