Den här artikeln innehåller exempel på hur du konverterar ett datum värde till en datetime2 värde i SQL Server.
När du konverterar ett datum värde till datetime2 , extra information läggs till värdet. Detta beror på att datetime2 datatypen innehåller information om både datum och tid. datumet datatyp, å andra sidan, innehåller endast datuminformation.
datetime2 datatypen är i grunden en förlängning av datetime data typ. Den har ett större datumintervall, en större standardbråkprecision och valfri användarspecificerad precision.
Hur som helst är konverteringsprocessen exakt densamma oavsett datatyp. Den enda skillnaden är mängden information som är tillgänglig mellan datum , datumtid och datetime2 .
Exempel 1 – Implicit konvertering
Här är ett exempel på en implicit konvertering mellan datum och datetime2 .
DECLARE @thedate date, @thedatetime2 datetime2 SET @thedate = '2020-12-01' SET @thedatetime2 = @thedate SELECT @thedate AS 'date', @thedatetime2 AS 'datetime2';
Resultat:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 | +------------+-----------------------------+
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 datumet värde till en datetime2 variabel.
Vi kan se att datumet variabeln innehåller endast datuminformation, medan datetime2 variabeln innehåller information om både datum och tid.
Dessutom får vi mer tidsinformation än vi skulle få om vi konverterade den till datetime datatyp.
När du konverterar mellan datum och datetime2 med standardprecisionen (7) sätts tidskomponenten till 00:00:00.0000000
(jämfört med 00:00:00.000
för datetime ). Du kan minska precisionen om du föredrar det (se nedan). Att minska precisionen kan också minska mängden utrymme som krävs för att lagra värdet.
Anledningen till att tidskomponenten bara är 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).
Exempel 2 – Ändra tiden
Om du behöver ange en tid (men behålla samma datum), kan du använda DATEADD()
funktion för att göra just det.
DECLARE @thedate date, @thedatetime2 datetime2 SET @thedate = '2020-12-01' SET @thedatetime2 = @thedate SET @thedatetime2 = DATEADD(hour, 8, @thedatetime2) SELECT @thedate AS 'date', @thedatetime2 AS 'datetime2';
Resultat:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 08:00:00.0000000 | +------------+-----------------------------+
Exempel 3 – 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 uttryckligen konvertera mellan datum och datetime2 .
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CAST(@thedate AS datetime2) AS 'datetime2';
Resultat:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 | +------------+-----------------------------+
Så vi får samma resultat som den implicita konverteringen.
Vi kan också justera tiden så här:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(hour, 8, CAST(@thedate AS datetime2)) AS 'datetime2';
Resultat:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 08:00:00.0000000 | +------------+-----------------------------+
Exempel 4 – Explicit konvertering med CONVERT()
Här är ett exempel på en explicit konvertering med CONVERT()
funktion istället för CAST()
.
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CONVERT(datetime2, @thedate) AS 'datetime2';
Resultat:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 | +------------+-----------------------------+
Och justera tiden:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(hour, 8, CONVERT(datetime2, @thedate)) AS 'datetime2';
Resultat:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 08:00:00.0000000 | +------------+-----------------------------+
Exempel 5 – Precision
datetime2 datatyp låter dig specificera precisionen (upp till standardvärdet 7). Med andra ord, du behöver inte använda hela 7 siffrorna om du inte behöver.
Exempel:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CONVERT(datetime2(2), @thedate) AS 'datetime2(2)', CONVERT(datetime2(4), @thedate) AS 'datetime2(4)';
Resultat:
+------------+------------------------+--------------------------+ | date | datetime2(2) | datetime2(4) | |------------+------------------------+--------------------------| | 2020-12-01 | 2020-12-01 00:00:00.00 | 2020-12-01 00:00:00.0000 | +------------+------------------------+--------------------------+
En fördel med att minska precisionen är att det också kan minska mängden utrymme som krävs för att lagra värdet. Speciellt 6 byte för precision mindre än 3, 7 byte för precision 3 eller 4, och all annan precision kräver 8 byte. Observera dock att den första byten används för att lagra precisionen, så det faktiska värdet är lagringsstorleken som anges här plus 1 extra byte för att lagra precisionen.