Database.Guide

Denna artikel innehåller exempel på hur man konverterar ett datumvärde till ett smalldatetime-värde i SQL Server.

När du konverterar ett datumvärde till smalldatetime läggs extra information till värdet. Detta beror på att datatypen smalldatetime innehåller både datum- och tidsinformation. Datatypen date däremot innehåller endast datuminformation.

Det finns dock fall där en konvertering från date till smalldatetime kan misslyckas. I synnerhet om datumvärdet ligger utanför det intervall som stöds av smalldatetime så kommer det att misslyckas med ett fel.

Under alla omständigheter finns nedan exempel på konvertering mellan dessa två datatyper.

Exempel 1 – implicit konvertering

Här är ett exempel på en implicit konvertering mellan datum och 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 |+------------+---------------------+

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 datumvärdet till en smalldatetime-variabel.

Vi kan se att datumvariabeln endast innehåller datuminformation, medan smalldatetime-variabeln innehåller både datum- och tidsinformation.

När du konverterar mellan datum och smalldatetime sätts tidskomponenten till 00:00:00. Detta ger en noggrannhet på minuten.

Anledningen till att det är alla nollor är att datumvärdet inte innehåller någon tidsinformation, så det finns inget sätt för SQL Server att veta vilken tid du vill ha (om någon).

Självklart får du också det här resultatet även om du helt enkelt tilldelar ett datumvärde till en smalldatetime utan att utföra en konvertering:

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

Resultat:

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

Exempel 2 – Ändra tiden

Om du behöver ange en tid (men behålla samma datum) kan du använda DATEADD()-funktionen för att göra just det.

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 |+------------+---------------------+

Exempel 3 – Explicit konvertering med hjälp av CAST()

Här är ett exempel på en explicit konvertering. I det här fallet använder jag funktionen CAST() direkt i SELECT-angivelsen för att explicit konvertera mellan datum och 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 |+------------+---------------------+

Samma resultat som den implicita konverteringen.

Vi kan också justera tiden så här:

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 |+------------+---------------------+

Exempel 4 – Explicit konvertering med hjälp av CONVERT()

Här är ett exempel på en explicit konvertering med hjälp av funktionen CONVERT() istället för 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 |+------------+---------------------+

Och justering av 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 |+------------+---------------------+

Exempel 5 – Fel utanför intervallet

Som nämnts får du ett fel om datumet ligger utanför det intervall som stöds av datatypen smalldatetime.

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 stöder endast datumintervallet 1900-01-01 till 2079-06-06.

Det finns också bara stöd för tidsintervallet 00:00:00 till 23:59:59 för datatypen smalldatetime, så du får också ett fel om du försöker använda ett värde utanför det intervallet (t.ex. med en högre precision).

Exempel:

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 det här fallet är det dock inte ett fel vid konverteringen, utan ett fel vid användningen av DATEADD()-funktionen (eftersom funktionen inte tillåter att just den datadelen används på en smalldatetime-datatypen).

Lämna ett svar

Din e-postadress kommer inte publiceras.