Тази статия съдържа примери за преобразуване на дата стойност до datetime2 стойност в SQL Server.
Когато конвертирате дата стойност на datetime2 , към стойността се добавя допълнителна информация. Това е така, защото datetime2 типът данни съдържа както информация за дата, така и за час. Датата типът данни, от друга страна, съдържа само информация за дата.
datetime2 типът данни е основно разширение на datetime тип данни. Той има по-голям диапазон от дати, по-голяма дробна точност по подразбиране и по избор, определена от потребителя точност.
Във всеки случай процесът на преобразуване е абсолютно същият, независимо от типа данни. Единствената разлика е количеството информация, която е налична между дата , дата и час и дата и час2 .
Пример 1 – Неявно преобразуване
Ето пример за имплицитно преобразуване между дата и дата и час2 .
DECLARE @thedate date, @thedatetime2 datetime2 SET @thedate = '2020-12-01' SET @thedatetime2 = @thedate SELECT @thedate AS 'date', @thedatetime2 AS 'datetime2';
Резултат:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 | +------------+-----------------------------+
Това е имплицитно преобразуване, защото не използваме функция за преобразуване (като тези по-долу), за да я преобразуваме изрично. В този случай SQL Server извършва имплицитно преобразуване зад кулисите, когато се опитваме да присвоим дата стойност до datetime2 променлива.
Виждаме, че датата променливата съдържа само информация за датата, докато datetime2 променливата съдържа информация за дата и час.
Освен това получаваме повече информация за времето, отколкото бихме получили, ако я преобразуваме в datetime тип данни.
Когато конвертирате между дата и дата и час2 използвайки точността по подразбиране (7), компонентът за време е настроен на 00:00:00.0000000
(в сравнение с 00:00:00.000
за дата и час ). Можете да намалите точността, ако предпочитате (вижте по-долу). Намаляването на точността може също да намали количеството пространство, необходимо за съхраняване на стойността.
Причината, поради която компонентът за време е нулев, е, че стойността на датата не съдържа никаква информация за времето, така че няма начин SQL Server да знае колко часа искате (ако има такъв).
Пример 2 – Промяна на времето
Ако трябва да посочите час (но да запазите същата дата), можете да използвате DATEADD()
функция да направи точно това.
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';
Резултат:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 08:00:00.0000000 | +------------+-----------------------------+
Пример 3 – Изрично преобразуване с помощта на CAST()
Ето пример за изрично преобразуване. В този случай използвам CAST()
функция директно в SELECT
изявление за изрично преобразуване между дата и дата и час2 .
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CAST(@thedate AS datetime2) AS 'datetime2';
Резултат:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 | +------------+-----------------------------+
Така получаваме същия резултат като имплицитното преобразуване.
Можем също така да коригираме времето по следния начин:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(hour, 8, CAST(@thedate AS datetime2)) AS 'datetime2';
Резултат:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 08:00:00.0000000 | +------------+-----------------------------+
Пример 4 – Изрично преобразуване с помощта на CONVERT()
Ето пример за изрично преобразуване с помощта на CONVERT()
функция вместо CAST()
.
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CONVERT(datetime2, @thedate) AS 'datetime2';
Резултат:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 | +------------+-----------------------------+
И коригиране на часа:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(hour, 8, CONVERT(datetime2, @thedate)) AS 'datetime2';
Резултат:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 08:00:00.0000000 | +------------+-----------------------------+
Пример 5 – Прецизност
datetime2 типът данни ви позволява да посочите точността (до 7 по подразбиране). С други думи, не е необходимо да използвате пълните 7 цифри, ако не е необходимо.
Пример:
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)';
Резултат:
+------------+------------------------+--------------------------+ | date | datetime2(2) | datetime2(4) | |------------+------------------------+--------------------------| | 2020-12-01 | 2020-12-01 00:00:00.00 | 2020-12-01 00:00:00.0000 | +------------+------------------------+--------------------------+
Едно от предимствата на намаляването на прецизността е, че може също да намали количеството пространство, необходимо за съхраняване на стойността. По-специално, 6 байта за прецизност по-малка от 3, 7 байта за точност 3 или 4, а всички останали прецизности изискват 8 байта. Имайте предвид обаче, че първият байт се използва за съхраняване на точността, така че действителната стойност е посоченият тук размер на съхранение плюс 1 допълнителен байт за съхраняване на точността.