Den här artikeln innehåller exempel på hur du konverterar en datetime2 värde till en smalldatetime värde i SQL Server.
En av fördelarna med att konvertera en datetime2 värde till smalldatetime är att du minskar lagringsstorleken från antingen 7, 8 eller 9 byte ner till 4 byte. Men du tappar precision.
datetime2 datatyp låter dig ange en bråkdelssekunderprecision från 0 till 7. Om du inte anger detta kommer den att använda 7 (standard). Om du anger noll (0
), kommer dess noggrannhet att vara till närmaste sekund.
smalldatetime datatypen å andra sidan, har inga bråkdelar av sekunder, och dess sekundkomponent är alltid noll (:00). Dess noggrannhet är till närmaste minut.
När du konverterar en datetime2 värde till smalldatetime , kopieras datum och del av tidsdelen. Sekundskomponenten sätts till noll (oavsett det ursprungliga värdet för sekundkomponenten) och tiden avrundas till närmaste minut. Eventuella bråkdelar tas bort.
Exempel 1 – Implicit konvertering
Här är ett exempel på en implicit konvertering mellan datetime2 och smalldatetime .
DEKLARE @thedatetime2 datetime2, @thesmalldatetime smalldatetime;SET @thedatetime2 ='2025-05-21 10:15:30.1234567';SET @thesmalldatetime =@thedatetime2;SELECT @thedatetime2 AS 'datetime2', 'thesmalldatetime' AS;
Resultat:
+------------------------------------+---------------- -----+| datetime2 | smalldatetime ||-------------------------------------+---------------- ----|| 2025-05-21 10:15:30.1234567 | 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 datetime2 värde till en smalldatetime variabel.
I det här exemplet kan vi se att smalldatetime värdet inkluderar inte bråksekunder, sekunderna har nollställts och minuten har avrundats uppåt.
I det här fallet, datetime2 värde använder en precision på 7. Detta beror på att 7 är standardvärdet. Jag angav ingen precision och därför användes standardvärdet.
Men det skulle ha gett samma resultat oavsett vilken precision jag valde. Även om jag hade reducerat det till noll (dvs. deklarerat det som datetime2(0)
), skulle det fortfarande ha gett samma resultat.
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 datetime2 och smalldatetime .
DECLARE @thedatetime2 datetime2(0);SET @thedatetime2 ='2025-05-21 10:15:30';SELECT @thedatetime2 AS 'datetime2', CAST(@thedatetime2 AS smalldatetime) AS 'smalldatetime';Resultat:
+----------------------------+---------------------+| datetime2 | smalldatetime ||----------------------+---------------------------|| 2025-05-21 10:15:30 | 2025-05-21 10:16:00 |+---------------------------+---------------- -----+I det här exemplet bestämde jag mig för att använda en skala med noll för datetime2 värde (dvs.
datetime2(0)
), men detta påverkar inte den resulterande smalldatetime värde.Exempel 3 – Explicit konvertering med CONVERT()
Här är ett exempel på en explicit konvertering med
CONVERT()
funktion istället förCAST()
.DECLARE @thedatetime2 datetime2(0);SET @thedatetime2 ='2025-05-21 10:15:30';SELECT @thedatetime2 AS 'datetime2', CONVERT(smalldatetime, @thedatetime2) AS 'smalldatetime';Resultat:
+----------------------------+---------------------+| datetime2 | smalldatetime ||----------------------+---------------------------|| 2025-05-21 10:15:30 | 2025-05-21 10:16:00 |+---------------------------+---------------- -----+