Denne artikel indeholder eksempler på konvertering af en smalldatetime værdi til en datetime2 værdi i SQL Server.
smalldatetime datatypen har ikke nogen brøksekunder, og dens sekunder-komponent er altid sat til nul (:00). Dens nøjagtighed er til nærmeste minut.
datetime2 datatype på den anden side giver dig mulighed for at angive en brøksekunders præcision fra 0 til 7. Hvis du ikke angiver dette, vil den bruge 7 (standard). Hvis du angiver nul (0
), vil dens nøjagtighed være til nærmeste sekund.
Når du konverterer en smalldatetime værdi til datetime2 , timer og minutter kopieres. Sekunderne og brøksekunderne er sat til 0.
Eksempel 1 – Implicit konvertering
Her er et eksempel på en implicit konvertering mellem smalldatetime og datetime2 .
DECLARE @thesmalldatetime smalldatetime, @thedatetime2 datetime2; SET @thesmalldatetime = '2025-05-21 10:15:30'; SET @thedatetime2 = @thesmalldatetime; SELECT @thesmalldatetime AS 'smalldatetime', @thedatetime2 AS 'datetime2';
Resultat:
+---------------------+-----------------------------+ | smalldatetime | datetime2 | |---------------------+-----------------------------| | 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 | +---------------------+-----------------------------+
Dette er en implicit konvertering, fordi vi ikke bruger en konverteringsfunktion (som dem nedenfor) til eksplicit at konvertere den. I dette tilfælde udfører SQL Server en implicit konvertering bag kulisserne, når vi forsøger at tildele smalldatetime værdi til en datetime2 variabel.
I dette eksempel kan vi se, at smalldatetime værdien inkluderer ikke brøksekunderne, sekunderne er blevet sat til nul, og minuttet er rundet op.
I dette tilfælde er datetime2 værdi bruger en præcision på 7. Dette skyldes, at 7 er standardværdien. Jeg specificerede ikke en præcision, og derfor blev standardværdien brugt. Dette resulterer i, at der bruges 7 nuller i brøkdelen.
Eksempel 2 – Fjern brøkdelen
Du kan fjerne brøksekunderne, hvis det kræves. For at gøre dette skal du blot bruge datetime2(0)
når variablen erklæres.
DECLARE @thesmalldatetime smalldatetime, @thedatetime2 datetime2(0); SET @thesmalldatetime = '2025-05-21 10:15:30'; SET @thedatetime2 = @thesmalldatetime; SELECT @thesmalldatetime AS 'smalldatetime', @thedatetime2 AS 'datetime2';
Resultat:
+---------------------+---------------------+ | smalldatetime | datetime2 | |---------------------+---------------------| | 2025-05-21 10:16:00 | 2025-05-21 10:16:00 | +---------------------+---------------------+
Så i dette tilfælde returnerer begge datatyper den samme værdi. Forskellen er dog, at datetime2 har evnen til at give nøjagtighed til den anden (sammenlignet med smalldatetime 's nøjagtighed til minuttet).
Eksempel:
DECLARE @thesmalldatetime smalldatetime, @thedatetime2 datetime2(0); SET @thesmalldatetime = '2025-05-21 10:15:30'; SET @thedatetime2 = @thesmalldatetime; SELECT DATEADD(second, 30, @thesmalldatetime) AS 'smalldatetime', DATEADD(second, 30, @thedatetime2) AS 'datetime2';
Resultat:
+---------------------+---------------------+ | smalldatetime | datetime2 | |---------------------+---------------------| | 2025-05-21 10:17:00 | 2025-05-21 10:16:30 | +---------------------+---------------------+
I dette eksempel brugte jeg DATEADD()
funktion til at tilføje 30 sekunder til hver værdi. Hver datatype returnerer dog et andet resultat. datetime2 datatype respekterer sekunddelen og giver det korrekte resultat med 100 % nøjagtighed. smalldatetime type på den anden side rundes op til nærmeste minut (mens sekunddelen forbliver på nul).
Eksempel 3 – Eksplicit konvertering ved hjælp af CAST()
Her er et eksempel på en eksplicit konvertering. I dette tilfælde bruger jeg CAST()
funktion direkte i SELECT
sætning til eksplicit at konvertere mellem smalldatetime og datetime2 .
DECLARE @thesmalldatetime smalldatetime; SET @thesmalldatetime = '2025-05-21 10:15:30'; SELECT @thesmalldatetime AS 'thesmalldatetime', CAST(@thesmalldatetime AS datetime2(0)) AS 'datetime2(0)';
Resultat:
+---------------------+---------------------+ | thesmalldatetime | datetime2(0) | |---------------------+---------------------| | 2025-05-21 10:16:00 | 2025-05-21 10:16:00 | +---------------------+---------------------+
Eksempel 4 – Eksplicit konvertering ved hjælp af CONVERT()
Her er et eksempel på en eksplicit konvertering ved hjælp af CONVERT()
funktion i stedet for CAST()
.
DECLARE @thesmalldatetime smalldatetime; SET @thesmalldatetime = '2025-05-21 10:15:30'; SELECT @thesmalldatetime AS 'thesmalldatetime', CONVERT(datetime2(0), @thesmalldatetime) AS 'datetime2(0)';
Resultat:
+---------------------+---------------------+ | thesmalldatetime | datetime2(0) | |---------------------+---------------------| | 2025-05-21 10:16:00 | 2025-05-21 10:16:00 | +---------------------+---------------------+