Den här artikeln innehåller exempel på hur du konverterar en smalldatetime värde till en datumtid värde i SQL Server.
När du konverterar en smalldatetime värde till datetime , timmarna och minuterna kopieras och sekunderna och bråkdelssekunderna ställs in på 0
.
Exempel 1 – 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 explicit konvertera från smalldatetime till datumtid .
DECLARE @thesmalldatetime smalldatetime SET @thesmalldatetime = '2031-03-25 11:15:29' SELECT @thesmalldatetime AS 'thesmalldatetime', CAST(@thesmalldatetime AS datetime) AS 'datetime';
Resultat:
+---------------------+-------------------------+ | thesmalldatetime | datetime | |---------------------+-------------------------| | 2031-03-25 11:15:00 | 2031-03-25 11:15:00.000 | +---------------------+-------------------------+
För det första kan vi se att thesmalldatetime värde använder 00
för komponenten sekunder, även om vi uttryckligen ställer in den på 29
. Detta beror på att när du använder thesmalldatetime datatyp är sekunderna alltid noll (och utan bråkdelar).
Därför, när vi konverterar värdet till datetime , ställs sekundvärdet (och bråkdelssekunder) till noll. Hade vi bara tilldelat det ursprungliga värdet till datetime i första hand skulle sekunderna ha förblivit intakta:
DECLARE @thedatetime datetime SET @thedatetime = '2031-03-25 11:15:29' SELECT @thedatetime AS 'thedatetime';
Resultat:
+-------------------------+ | thedatetime | |-------------------------| | 2031-03-25 11:15:29.000 | +-------------------------+
Inte bara sekunderna skulle förbli intakta, utan även bråkdelar av sekunder skulle ha förblivit intakta (men bara upp till en skala från 3):
DECLARE @thedatetime datetime SET @thedatetime = '2031-03-25 11:15:29.123' SELECT @thedatetime AS 'thedatetime';
Resultat:
+-------------------------+ | thedatetime | |-------------------------| | 2031-03-25 11:15:29.123 | +-------------------------+
Exempel 2 – Avrundning
Här är vad som händer om vi ställer in sekundskomponenten till ett högre värde innan vi tilldelar den till smalldatetime data typ.
DECLARE @thesmalldatetime smalldatetime SET @thesmalldatetime = '2031-03-25 11:15:31' SELECT @thesmalldatetime AS 'thesmalldatetime', CAST(@thesmalldatetime AS datetime) AS 'datetime';
Resultat:
+---------------------+-------------------------+ | thesmalldatetime | datetime | |---------------------+-------------------------| | 2031-03-25 11:16:00 | 2031-03-25 11:16:00.000 | +---------------------+-------------------------+
Så minutkomponenten avrundas nu uppåt till nästa minut.
Exempel 3 – Explicit konvertering med CONVERT()
Detta är samma som det första exemplet, förutom att den här gången använder jag CONVERT()
funktion istället för CAST()
.
DECLARE @thesmalldatetime smalldatetime SET @thesmalldatetime = '2031-03-25 11:15:29' SELECT @thesmalldatetime AS 'thesmalldatetime', CONVERT(datetime, @thesmalldatetime) AS 'datetime';
Resultat:
+---------------------+-------------------------+ | thesmalldatetime | datetime | |---------------------+-------------------------| | 2031-03-25 11:15:00 | 2031-03-25 11:15:00.000 | +---------------------+-------------------------+
Exempel 4 – Implicit konvertering
Här är ett exempel på att göra samma sak, men med en implicit typkonvertering.
DECLARE @thesmalldatetime smalldatetime, @thedatetime datetime SET @thesmalldatetime = '2031-03-25 11:15:29' SET @thedatetime = @thesmalldatetime SELECT @thesmalldatetime AS 'thesmalldatetime', @thedatetime AS 'datetime';
Resultat:
+---------------------+-------------------------+ | thesmalldatetime | datetime | |---------------------+-------------------------| | 2031-03-25 11:15:00 | 2031-03-25 11:15:00.000 | +---------------------+-------------------------+
Så vi får samma resultat, oavsett om det är en explicit eller implicit konvertering.
Detta är en implicit konvertering eftersom vi inte använder en konverteringsfunktion för att explicit konvertera den. Vi tilldelar helt enkelt värdet från en variabel av en datatyp till en variabel av en annan datatyp. I det här fallet utför SQL Server en implicit konvertering bakom kulisserna när vi försöker tilldela smalldatetime värde till en datumtid variabel.