Om du har en datumtidsförskjutning värde, men du behöver inte förskjutningsdelen för datum och tidszon, konvertera den till tid kommer att spara mycket lagringsutrymme (samtidigt som du tar bort onödiga detaljer från värdet). Den här artikeln innehåller exempel på hur du konverterar en datumtidsförskjutning värde till en tid värde i SQL Server.
datetimeoffset datatypen inkluderar datum och tid med en tidszonförskjutning. Den har också en del av bråkdelssekunder mellan 0 och 7 (detta beror på hur många bråksekunder som är tilldelade den). Detta görs genom att använda datetimeoffset(n)
syntax. Om du inte anger detta kommer den att använda 7 (standard). Den här datatypens lagringsstorlek är antingen 8, 9 eller 10 byte, beroende på vilken precision som används. Dess noggrannhet är 100 nanosekunder.
tiden datatyp å andra sidan, inkluderar bara tiden. Det inkluderar inte datumet och det inkluderar inte tidszonsförskjutningen. Dock liknande datetimeoffset det låter dig också ange en del av bråkdelssekunder mellan 0 och 7 (genom att använda time(n)
syntax). Den använder antingen 3, 4 eller 5 byte, beroende på dess precision.
När du konverterar en datumtidsförskjutning värde till en tid datatyp förlorar du datumdelen. Du förlorar också tidszonförskjutningen. Men du minskar också lagringsstorleken från mellan 8 och 10 byte ner till antingen 3, 4 eller 5 byte. Du skulle dock bara göra den här konverteringen om du inte behöver datumdelen eller tidszonsförskjutningen.
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. Därför måste du lägga till 1 byte till beloppen som anges här.
Exempel 1 – Implicit konvertering
Här är ett exempel på en implicit konvertering mellan datetimeoffset och tid .
DECLARE @thedatetimeoffset datetimeoffset, @thetime time; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30'; SET @thetime = @thedatetimeoffset; SELECT @thedatetimeoffset AS 'datetimeoffset', @thetime AS 'time';
Resultat:
+------------------------------------+------------------+ | datetimeoffset | time | |------------------------------------+------------------| | 2025-05-21 10:15:30.1234567 +10:30 | 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 tid variabel.
Här kan vi se att tiden värdet inkluderar endast tiden (utan datumkomponenten). Komponenterna för datum- och tidszonförskjutning har tagits bort från värdet.
I det här exemplet använder båda datatyperna standardprecisionen (vilket resulterar i 7 decimaler). Detta resulterar i datetimeoffset värde med 10 byte och tiden värde med 5 byte.
Exempel 2 – Precision
Det exakta resultatet beror på precisionsinställningarna för varje datatyp. I nästa exempel är tiden värde använder en lägre precision jämfört med den ursprungliga datetime offset värde:
DECLARE @thedatetimeoffset datetimeoffset(7), @thetime time(3); SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30'; SET @thetime = @thedatetimeoffset; SELECT @thedatetimeoffset AS 'datetimeoffset', @thetime AS 'time';
Resultat:
+------------------------------------+------------------+ | datetimeoffset | time | |------------------------------------+------------------| | 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1230000 | +------------------------------------+------------------+
Mitt system visar avslutande nollor, men poängen är att tiden värde har nu en precision på bara 3 decimaler jämfört med de 7 decimaler som det ursprungliga värdet använder.
Att minska precisionen kan också resultera i tiden värdet avrundas uppåt. Här är ett exempel:
DECLARE @thedatetimeoffset datetimeoffset(7), @thetime time(3); SET @thedatetimeoffset = '2025-05-21 10:15:30.1235555 +10:30'; SET @thetime = @thedatetimeoffset; SELECT @thedatetimeoffset AS 'datetimeoffset', @thetime AS 'time';
Resultat:
+------------------------------------+------------------+ | datetimeoffset | time | |------------------------------------+------------------| | 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1240000 | +------------------------------------+------------------+
I det här fallet får vi en bråkdel av 124 istället för 123 , eftersom följande siffra var 5 eller högre.
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 tid .
DECLARE @thedatetimeoffset datetimeoffset; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30'; SELECT @thedatetimeoffset AS 'datetimeoffset', CAST(@thedatetimeoffset AS time) AS 'time';
Resultat:
+------------------------------------+------------------+ | datetimeoffset | date | |------------------------------------+------------------| | 2025-05-21 10:15:30.1234567 +10:30 | 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 +10:30'; SELECT @thedatetimeoffset AS 'datetimeoffset', CONVERT(time, @thedatetimeoffset) AS 'time';
Resultat:
+------------------------------------+------------------+ | datetimeoffset | date | |------------------------------------+------------------| | 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1234567 | +------------------------------------+------------------+