Denne artikel indeholder eksempler på konvertering af en tid værdi til en smalldatetime værdi i SQL Server.
Når du konverterer en tid værdi til smalldatetime , er datoen sat til '1900-01-01', og time- og minutværdierne rundes op. Sekunderne og brøksekunderne er sat til 0.
Eksempel 1 – 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 for eksplicit at konvertere fra tid til smalldatetime .
DECLARE @thetime time; SET @thetime = '23:15:59.1234567'; SELECT @thetime AS 'time', CAST(@thetime AS smalldatetime) AS 'smalldatetime';
Resultat:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1900-01-01 23:16:00 | +------------------+---------------------+
Så en datodel tilføjes og indstilles til '1900-01-01', og i dette tilfælde rundes minutværdierne op, og sekunderne indstilles til 0.
Microsoft-dokumentationen angiver, at brøksekunderne også er sat til nul, men smalldatetime datatypen inkluderer alligevel ikke brøkdele sekunder.
Forresten, når du bruger smalldatetime datatype, er sekunder-komponenten altid sat til 0.
Eksempel 2 – Afrunding af timen
Her er et eksempel på, hvor timen rundes op:
DECLARE @thetime time(0); SET @thetime = '10:59:59'; SELECT @thetime AS 'time', CAST(@thetime AS smalldatetime) AS 'smalldatetime';
Resultat:
+----------+---------------------+ | time | smalldatetime | |----------+---------------------| | 10:59:59 | 1900-01-01 11:00:00 | +----------+---------------------+
I dette tilfælde har jeg også specificeret en skala på 0 for tidsværdien, men dette påvirker ikke resultatet.
Bare for at være klar, skaler er antallet af cifre til højre for decimaltegnet i et tal. Nøjagtighed er det samlede antal cifre i tallet. Når vi angiver en skala på 0, betyder det, at brøkdelen ikke er inkluderet.
Eksempel 3 – Eksplicit konvertering ved hjælp af CONVERT()
Her er et eksempel, der bruger CONVERT()
funktion i stedet for CAST()
.
DECLARE @thetime time; SET @thetime = '23:15:59.1234567'; SELECT @thetime AS 'time', CONVERT(smalldatetime, @thetime) AS 'smalldatetime';
Resultat:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1900-01-01 23:16:00 | +------------------+---------------------+
Eksempel 4 – Implicit konvertering
Her er et eksempel på at gøre det samme, men ved at bruge en implicit typekonvertering.
DECLARE @thetime time, @thesmalldatetime smalldatetime; SET @thetime = '23:15:59.1234567'; SET @thesmalldatetime = @thetime; SELECT @thetime AS 'time', @thesmalldatetime AS 'smalldatetime';
Resultat:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1900-01-01 23:16:00 | +------------------+---------------------+
Så vi får det samme resultat, uanset om det er en eksplicit eller implicit konvertering.
Dette er en implicit konvertering, fordi vi ikke bruger en konverteringsfunktion til eksplicit at konvertere den. Vi tildeler simpelthen værdien fra en variabel af én datatype til en variabel af en anden datatype. I dette tilfælde udfører SQL Server en implicit konvertering bag kulisserne, når vi forsøger at tildele tidspunktet værdi til en smalldatetime variabel.
Eksempel 5 – Skift datoen
Hvis du har brug for at ændre datoen (men beholde den samme tid), kan du bruge DATEADD()
fungere.
DECLARE @thetime time, @thesmalldatetime smalldatetime; SET @thetime = '23:15:59.1234567'; SET @thesmalldatetime = @thetime; SET @thesmalldatetime = DATEADD(year, 85, @thesmalldatetime); SELECT @thetime AS 'time', @thesmalldatetime AS 'smalldatetime';
Resultat:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1985-01-01 23:16:00 | +------------------+---------------------+
I dette tilfælde tilføjer jeg 85 til årsværdien, hvilket bringer den til 1985.
Vær dog opmærksom på, at smalldatetime understøtter et meget snævert datointerval (1900-01-01 til 2079-06-06), så tilføjelse af for meget til året kan resultere i en overløbsfejl som den nedenfor:
DECLARE @thetime time, @thesmalldatetime smalldatetime; SET @thetime = '23:15:59.1234567'; SET @thesmalldatetime = @thetime; SET @thesmalldatetime = DATEADD(year, 220, @thesmalldatetime); SELECT @thetime AS 'time', @thesmalldatetime AS 'smalldatetime';
Resultat:
Adding a value to a 'smalldatetime' column caused an overflow.