Тази статия съдържа примери за преобразуване на datetimeoffset стойност на datetime2 в SQL Server.
Когато конвертирате datetimeoffset стойност на datetime2 , датата и часът се копират в datetime2 стойност и часовата зона е съкратена. Частичните секунди също се съкращават, за да паснат, ако точността на дестинацията е по-ниска.
отместването на датата и времето типът данни ви позволява да зададете частична точност от секунди от 0 до 7 с помощта на datetimeoffset(n)
синтаксис. Ако не посочите това, той ще използва 7 (по подразбиране). Има и изместване на часовата зона. Размерът за съхранение на този тип данни е 8, 9 или 10 байта, в зависимост от използваната прецизност.
datetime2 типът данни също ви позволява да зададете частична точност от секунди от 0 до 7 (с помощта на datetime2(n)
синтаксис). Той няма информираност за часовата зона. Размерът му за съхранение е 6, 7 или 8, в зависимост от използваната прецизност.
Имайте предвид, че изброените тук количества за съхранение са количествата, изброени в документацията на Microsoft. Тези типове данни обаче също използват 1 байт за съхранение на точността. Затова добавете 1 байт към изброените тук количества за по-пълна картина на изискванията за съхранение.
Пример 1 – Неявно преобразуване
Ето пример за имплицитно преобразуване между datetimeoffset и дата и час2 .
ДЕКЛАРИРАЙТЕ @thedatetimeoffset datetimeoffset, @thedatetime2 datetime2;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SET @thedatetime2 =@thedatetimeoffset;offset da SELECT @thedatimeoffset;offset да ИЗБРАТЕ КАТО' КАТО 'datetime2';
Резултат:
+----------------------------------+-------- --------------------+| datetimeoffset | datetime2 ||-----------------------------------+--------- -------------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.1234567 |+------------------------------------+- ----------------------------+
Това е имплицитно преобразуване, защото не използваме функция за преобразуване (като тези по-долу), за да я преобразуваме изрично. В този случай SQL Server изпълнява имплицитно преобразуване зад кулисите, когато се опитваме да присвоим datetimeoffset стойност до datetime2 променлива.
В този пример и двата типа данни използват точността по подразбиране (7 знака след десетичната запетая). Следователно, дробната част беше 1234567 и за двата резултата.
Виждаме също, че изместването на часовата зона е съкратено – datetime2 типът данни няма информация за часовата зона.
При това преобразуване размерът на хранилището е намалял от 10 байта (за datetimeoffset ) до 8 байта (за datetime2 ), въпреки че имайте предвид, че се добавя 1 байт, за да се съхрани точността.
Пример 2 – Различна прецизност
Ето пример, който демонстрира какво се случва, ако datetime2 стойност използва по-ниска прецизност на datetimeoffset стойност.
DECLARE @thedatetimeoffset datetimeoffset(7), @thedatetime2 datetime2(3);SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SET @thedatetime2 =@thedatetime2 =@thedatetimeoffset;SET AS @thedatetimeoffset; 'datetimeoffset', @thedatetime2 AS 'datetime2';
Резултат:
+----------------------------------+-------- ----------------+| datetimeoffset | datetime2 ||-----------------------------------+--------- ---------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 |+------------------------------------+- ------------------------+
В този пример datetimeoffset има скала от 7
но datetime2 стойност има мащаб само от 3
. Следователно частичните секунди бяха съкратени, за да паснат.
Имайте предвид, че това може да доведе до закръгляване. Ето пример, където дробната част на datetime2 стойността се закръглява до 124 .
DECLARE @thedatetimeoffset datetimeoffset(7), @thedatetime2 datetime2(3);SET @thedatetimeoffset ='2025-05-21 10:15:30.1235555 +07:00';SET @thedatetime2 =@thedatetime2 =@thedatetimeoffset; 'datetimeoffset', @thedatetime2 AS 'datetime2';
Резултат:
+----------------------------------+-------- ----------------+| datetimeoffset | datetime2 ||-----------------------------------+--------- ---------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.124 |+------------------------------------+- ------------------------+
Пример 3 – Изрично преобразуване с помощта на CAST()
Ето пример за изрично преобразуване. В този случай използвам CAST()
функция директно в SELECT
изявление за изрично преобразуване между datetimeoffset и дата и час2 .
DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SELECT @thedatetimeoffset КАТО 'datetimeoffset', CAST(@thedatetimeoffset) AS' date;' /предварително>Резултат:
+----------------------------------+-------- --------------------+| datetimeoffset | datetime2 ||-----------------------------------+--------- -------------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.1234567 |+------------------------------------+- ----------------------------+Пример 4 – Изрично преобразуване с помощта на CONVERT()
Ето пример за изрично преобразуване с помощта на
CONVERT()
функция вместоCAST()
.DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';ИЗБЕРЕТЕ @thedatetimeoffset КАТО 'datetimeoffset', CONVERT(datetime2,offset