Den här artikeln innehåller exempel på hur du konverterar en datumtidsförskjutning värde till smalldatetime i SQL Server.
När du konverterar en datumtidsförskjutning värde till smalldatetime , datum och tider kopieras. Minuterna avrundas uppåt (beroende på sekundvärdet) och sekunderna sätts till 0.
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 (plus 1 byte för precisionen), beroende på vilken precision som används.
smalldatetime datatypen å andra sidan, har inte tidszonsmedvetenhet, och därför inkluderar den inte någon tidszonsförskjutning. Den har inte heller några bråkdelar av sekunder, och dess sekundkomponent är alltid noll (:00). Dess noggrannhet är till närmaste minut. Den här datatypens lagringsstorlek är fast till 4 byte.
Exempel 1 – Implicit konvertering
Här är ett exempel på en implicit konvertering mellan datetimeoffset och smalldatetime .
DECLARE @thedatetimeoffset datetimeoffset, @thesmalldatetime smalldatetime;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SET @thesmalldatetime =@thedatetimeoffset;SELECT @thedatesmalldateoffset', 'date AS 'smalldatetime';
Resultat:
+--------------------------------------------+-------- ------------+| datetimeoffset | smalldatetime ||---------------------------------------------+---------------- ----------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:16:00 |+--------------------------------------------+- --------------------+
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 smalldatetime variabel.
Vi kan se att smalldatetime variabeln har ingen bråksekundersprecision och dess sekunder har nollställts. Dessutom har protokollet avrundats uppåt på grund av att det ursprungliga värdet hade ett sekundsvärde på 30.
En annan observation är att tidszonsförskjutningen trunkerades – smalldatetime datatypen har ingen tidszonsmedvetenhet.
I den här konverteringen har lagringsstorleken minskat från 10 byte (11 byte när du räknar precisionen) för datetimeoffset , till 4 byte för smalldatetime .
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 smalldatetime .
DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SELECT @thedatetimeoffset AS 'datetimeoffset', CAST(@thedatetimeoffset AS smalldatetime) AS 'smalldatetime' /pre>Resultat:
+--------------------------------------------+-------- ----------------+| datetimeoffset | smalldatetime ||---------------------------------------------+---------------- ---------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:16:00 |+--------------------------------------------+- ------------------------+Exempel 3 – 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(smalldatetime, @thedatetimeoffsettime) AS /pre>Resultat:
+--------------------------------------------+-------- ----------------+| datetimeoffset | smalldatetime ||---------------------------------------------+---------------- ---------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:16:00 |+--------------------------------------------+- ------------------------+