sql >> Databasteknik >  >> RDS >> Sqlserver

Konvertera "datetimeoffset" till "datetime" i SQL Server (T-SQL-exempel)

Den här artikeln innehåller exempel på hur du konverterar en datumtidsförskjutning värde till datetime i SQL Server.

När du konverterar en datumtidsförskjutning värde till datetime , datum- och tidsvärdena kopieras och tidszonförskjutningen trunkeras. När bråkdelprecisionen för datetimeoffset värdet är större än tre siffror, trunkeras värdet.

datetimeoffset datatyp låter dig ange en bråkdelssekunderprecision från 0 till 7. Detta görs med hjälp av 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. En annan byte används för att lagra precisionen så detta lägger till 1 byte till dessa siffror.

datetime datatyp, å andra sidan, har högst 3 siffror för sin del av bråkdelssekunder. Dess noggrannhet avrundas till steg om 0,000, 0,003 eller 0,007 sekunder. Denna datatyp har ingen tidszonsmedvetenhet och därför ingen tidszonsförskjutning. Dess lagringsstorlek är 8 byte.

Exempel 1 – Implicit konvertering

Här är ett exempel på en implicit konvertering mellan datetimeoffset och datumtid .

DECLARE @thedatetimeoffset datetimeoffset, @thedatetime datetime;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SET @thedatetime =@thedatetimeoffset;SELECT @thedatetimeoffset, @thedatetimeoffset' AS 'datetime';

Resultat:

+--------------------------------------------+-------- ----------------+| datetimeoffset | datetime ||---------------------------------------------+---------------- ---------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 |+-------------------------------------------+- ------------------------+

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 datumtid variabel.

Vi kan se att datetime variabel har mindre bråksekundersprecision, och vi slutar med en bråkdel av 123 även om den ursprungliga bråkdelen var 1234567 .

I det här fallet utfördes ingen avrundning.

Vi ser också att tidszonsförskjutningen trunkerades. datetime datatypen har ingen tidszonsmedvetenhet.

I den här konverteringen har lagringsstorleken minskat från 10 byte (11 byte om du inkluderar den extra byten som lagrar precisionen) för datetimeoffset , till 8 byte för datetime . Men om datetimeoffset värde hade använt en skala mellan 0 och 2, skulle det endast ha använt 8 byte (9 inklusive precision).

Om den hade använt en skala på 3 (motsvarande datetime värde), skulle lagringsstorleken ha varit 9 byte (10 med precision). Dess noggrannhet skulle dock ha varit högre än datetime . Naturligtvis skulle noggrannheten minska så snart vi konverterade den till datetime .

Exempel 2 – Precision/noggrannhet och 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 gäller även vid konvertering från en annan datatyp (som det vi gör här).

Här är ett exempel som visar vad jag menar.

DECLARE @thedatetimeoffset datetimeoffset, @thedatetime datetime;SET @thedatetimeoffset ='2025-05-21 10:15:30.1250000 +07:00';SET @thedatetime =@thedatetimeoffset;SELECT @thedatetimeoffset, @thedatetimeoffset' AS 'datetime';

Resultat:

+--------------------------------------------+-------- ----------------+| datetimeoffset | datetime ||---------------------------------------------+---------------- ---------------|| 2025-05-21 10:15:30.1250000 +07:00 | 2025-05-21 10:15:30.127 |+-------------------------------------------+- ------------------------+

I det här exemplet ställer jag in bråkdelssekunderna för datetimeoffset värde till 1250000 men datumtid rundade det upp till 127 (eftersom det bara kan avrundas till steg om 0,000, 0,003 eller 0,007 sekunder).

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 datumtid .

DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SELECT @thedatetimeoffset AS 'datetimeoffset', CAST(@thedatetimeoffset AS datetime) 

Resultat:

+--------------------------------------------+-------- ----------------+| datetimeoffset | datetime ||---------------------------------------------+---------------- ---------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 |+-------------------------------------------+- ------------------------+

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(datetime, @thedatetimeoffset) 

Resultat:

+--------------------------------------------+-------- ----------------+| datetimeoffset | datetime ||---------------------------------------------+---------------- ---------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 |+-------------------------------------------+- ------------------------+

  1. Beräkna decil från frekvens i MySQL

  2. Hur man hanterar booleska värden i SQLite med JavaScript-proxies

  3. Hur PI() fungerar i MariaDB

  4. Implementera automatisk säkerhetskopiering och återställning av databas med standardmedel