Database.Guide

Denne artikel indeholder eksempler på konvertering af en datoværdi til en smalldatetime-værdi i SQL Server.

Når du konverterer en datoværdi til smalldatetime, tilføjes der ekstra oplysninger til værdien. Det skyldes, at datatypen smalldatetime indeholder både dato- og tidsoplysninger. Datatypen date indeholder derimod kun datoinformationer.

Der er dog tilfælde, hvor en konvertering fra date til smalldatetime kan mislykkes. Især hvis datoværdien er uden for det område, der understøttes af smalldatetime, vil det mislykkes med en fejl.

Under alle omstændigheder er der nedenfor eksempler på konvertering mellem disse to datatyper.

Eksempel 1 – Implicit konvertering

Her er et eksempel på en implicit konvertering mellem date og smalldatetime.

DECLARE @thedate date, @thesmalldatetime smalldatetimeSET @thedate = '2020-12-01'SET @thesmalldatetime = @thedateSELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';

Resultat:

+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00:00 |+------------+---------------------+

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 datoværdien til en smalldatetime-variabel.

Vi kan se, at datovariablen kun indeholder datoinformationer, mens smalldatetime-variablen indeholder både dato- og tidsinformationer.

Når du konverterer mellem date og smalldatetime, bliver tidskomponenten sat til 00:00:00. Dette giver en nøjagtighed på et minut.

Grunden til, at det hele er nuller, er, at datoværdien ikke indeholder nogen tidsoplysninger, så SQL Server kan ikke vide, hvilket tidspunkt du ønsker (hvis der er nogen).

Selvfølgelig får du også dette resultat, selv om du blot tildeler en værdi kun for dato til en smalldatetime uden at udføre en konvertering:

DECLARE @thesmalldatetime smalldatetime = '2020-12-01'SELECT @thesmalldatetime AS 'smalldatetime';

Resultat:

+---------------------+| smalldatetime ||---------------------|| 2020-12-01 00:00:00 |+---------------------+

Eksempel 2 – Ændre tidspunktet

Hvis du har brug for at angive et tidspunkt (men beholder den samme dato), kan du bruge funktionen DATEADD() til at gøre netop dette.

DECLARE @thedate date, @thesmalldatetime smalldatetimeSET @thedate = '2020-12-01'SET @thesmalldatetime = @thedateSET @thesmalldatetime = DATEADD(hour, 7, @thesmalldatetime)SELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';

Resultat:

+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 07:00:00 |+------------+---------------------+

Eksempel 3 – Eksplicit konvertering ved hjælp af CAST()

Her er et eksempel på en eksplicit konvertering. I dette tilfælde bruger jeg CAST()-funktionen direkte i SELECT-erklæringen til eksplicit at konvertere mellem dato og smalldatetime.

DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';

Resultat:

+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00:00 |+------------+---------------------+

Samme resultat som i den implicitte konvertering.

Vi kan også justere tiden på denne måde:

DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', DATEADD(hour, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';

Resultat:

+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 07:00:00 |+------------+---------------------+

Eksempel 4 – Eksplicit konvertering ved hjælp af CONVERT()

Her er et eksempel på en eksplicit konvertering ved hjælp af funktionen CONVERT() i stedet for CAST().

DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', CONVERT(smalldatetime, @thedate) AS 'smalldatetime';

Resultat:

+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00:00 |+------------+---------------------+

Og justering af tiden:

DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', DATEADD(hour, 7, CONVERT(smalldatetime, @thedate)) AS 'smalldatetime';

Resultat:

+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 07:00:00 |+------------+---------------------+

Eksempel 5 – Fejl uden for området

Som nævnt får du en fejl, hvis datoen ligger uden for det område, der understøttes af smalldatetime-datatypen, hvis du får en fejl.

DECLARE @thedate dateSET @thedate = '2080-12-01'SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';

Resultat:

The conversion of a date data type to a smalldatetime data type resulted in an out-of-range value.

Datatypen smalldatetime understøtter kun datointervallerne 1900-01-01-01 til 2079-06-06.

Den lille datatype smalldatetime understøtter også kun tidsintervallerne 00:00:00:00 til 23:59:59:59, så du får også en fejl, hvis du forsøger at bruge en værdi uden for dette interval (f.eks. med en højere præcision).

Eksempel:

DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', DATEADD(nanosecond, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';

Resultat:

The datepart nanosecond is not supported by date function dateadd for data type smalldatetime.

I dette tilfælde er det dog ikke en fejl under konverteringen, det er faktisk en fejl under brugen af DATEADD()-funktionen (fordi funktionen ikke tillader, at den pågældende datodel kan bruges på en smalldatetime-datatatype).

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.