Om du har en datumtidsförskjutning värde, men du behöver inte tids- och tidszonsoffsetdelen, konvertera den till datum 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 ett datum 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 tilldelas 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 (plus 1 byte för att lagra precisionen), beroende på vilken precision som används. Dess noggrannhet är 100 nanosekunder.
datumet datatyp å andra sidan inkluderar endast datumet. Den inkluderar inte tiden, och den har en noggrannhet på 1 dag. Den använder 3 byte för lagring.
När du konverterar en datumtidsförskjutning värde till ett datum datatyp, förlorar du tidsdelen (inklusive tidszonförskjutningen). Men du minskar också lagringsstorleken till en fast 3 byte. Naturligtvis skulle du bara göra den här konverteringen om du inte behöver tidsdelen och tidszonsförskjutningen.
Exempel 1 – Implicit konvertering
Här är ett exempel på en implicit konvertering mellan datetimeoffset och datum .
DECLARE @thedatetimeoffset datetimeoffset, @thedate date; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30'; SET @thedate = @thedatetimeoffset; SELECT @thedatetimeoffset AS 'datetimeoffset', @thedate AS 'date';
Resultat:
+------------------------------------+------------+ | datetimeoffset | date | |------------------------------------+------------| | 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 | +------------------------------------+------------+
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 ett datum variabel.
Här kan vi se att datumet värdet inkluderar endast datumet (utan tidskomponenten). Tidskomponenten, inklusive dess tidszonförskjutning, har tagits bort från värdet.
I det här exemplet är datetimeoffset värde använder standardprecisionen (vilket resulterar i 7 decimaler). Detta resulterar i att datatypen använder 10 byte (faktiskt 11 byte om du räknar den extra byte som lagrar precisionen). datumet värde använder bara 3 byte.
Exempel 2 – 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 datum .
DECLARE @thedatetimeoffset datetimeoffset; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30'; SELECT @thedatetimeoffset AS 'datetimeoffset', CAST(@thedatetimeoffset AS date) AS 'date';
Resultat:
+------------------------------------+------------+ | datetimeoffset | date | |------------------------------------+------------| | 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 | +------------------------------------+------------+
Exempel 3 – 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(date, @thedatetimeoffset) AS 'date';
Resultat:
+------------------------------------+------------+ | datetimeoffset | date | |------------------------------------+------------| | 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 | +------------------------------------+------------+