Den här artikeln innehåller exempel på hur du konverterar en datumtid värde till en smalldatetime värde i SQL Server.
En av fördelarna med att konvertera en datumtid värde till smalldatetime är att du minskar lagringsstorleken från 8 byte ner till 4 byte. Men du tappar precision för att göra det.
datetime datatypen inkluderar en 3-siffrig del av bråkdelssekunder. Dess noggrannhet är avrundad till steg om 0,000, 0,003 eller 0,007 sekunder.
smalldatetime datatypen å andra sidan, har inte några bråkdelar av sekunder, och dess sekundkomponent är alltid inställd på noll (:00). Dessutom har den bara en noggrannhet till närmaste minut.
När du konverterar en datumtid värde till smalldatetime , kopieras datum och del av tidsdelen. Sekundskomponenten sätts till noll (oavsett det ursprungliga värdet) 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 datetime och smalldatetime .
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.123'; SET @thesmalldatetime = @thedatetime; SELECT @thedatetime AS 'datetime', @thesmalldatetime AS 'smalldatetime';
Resultat:
+-------------------------+---------------------+ | datetime | smalldatetime | |-------------------------+---------------------| | 2025-05-21 10:15:30.123 | 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 datetime 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.
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 datetime och smalldatetime .
DECLARE @thedatetime datetime; SET @thedatetime = '2025-05-21 10:15:30.125'; SELECT @thedatetime AS 'datetime', CAST(@thedatetime AS smalldatetime) AS 'smalldatetime';
Resultat:
+-------------------------+---------------------+ | datetime | smalldatetime | |-------------------------+---------------------| | 2025-05-21 10:15:30.127 | 2025-05-21 10:16:00 | +-------------------------+---------------------+
Du kanske har märkt att jag i det här exemplet ändrade bråksekunderna när jag tilldelade det initiala värdet till @thedatetime
. Men för att jag tilldelar det till en datumtid datatyp, avrundas delen av bråkdelssekunder uppåt (eftersom dess noggrannhet avrundas till steg om 0,000, 0,003 eller 0,007 sekunder). I det här fallet försöker jag tilldela en bråkdel av 125
men det avrundas uppåt till 127
.
Detta påverkar dock inte smalldatetime värde.
Exempel 3 – Explicit konvertering med CONVERT()
Här är ett exempel på en explicit konvertering med CONVERT()
funktion istället för CAST()
.
DECLARE @thedatetime datetime; SET @thedatetime = '2025-05-21 10:15:30.125'; SELECT @thedatetime AS 'datetime', CONVERT(smalldatetime, @thedatetime) AS 'smalldatetime';
Resultat:
+-------------------------+---------------------+ | datetime | smalldatetime | |-------------------------+---------------------| | 2025-05-21 10:15:30.127 | 2025-05-21 10:16:00 | +-------------------------+---------------------+