Тази статия съдържа примери за преобразуване на datetimeoffset стойност до дата и час в SQL Server.
Когато конвертирате datetimeoffset стойност до дата и час , стойностите за дата и час се копират, а отместването на часовата зона се съкращава. Когато дробната точност на datetimeoffset стойността е по-голяма от три цифри, стойността е съкратена.
отместването на датата и времето типът данни ви позволява да зададете частична точност от секунди от 0 до 7. Това се прави с помощта на datetimeoffset(n)
синтаксис. Ако не посочите това, той ще използва 7 (по подразбиране). Има и изместване на часовата зона. Размерът за съхранение на този тип данни е 8, 9 или 10 байта, в зависимост от използваната прецизност. Друг байт се използва за съхраняване на точността, така че това добавя 1 байт към тези цифри.
Дата и час типът данни, от друга страна, има максимум 3 цифри за частта от секундите. Неговата точност се закръглява до стъпки от .000, .003 или .007 секунди. Този тип данни няма информация за часовата зона и следователно няма изместване на часовата зона. Размерът му за съхранение е 8 байта.
Пример 1 – Неявно преобразуване
Ето пример за имплицитно преобразуване между datetimeoffset и дата и час .
ДЕКЛАРИРАЙТЕ @thedatetimeoffset datetimeoffset, @thedatetime datetime;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SET @thedatetime =@thedatetimeoffset;ИЗБЕРЕТЕ ИЗКЛ. КАТО 'datetime';
Резултат:
+----------------------------------+-------- ----------------+| datetimeoffset | дата и час ||------------------------------------+---------- ---------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 |+------------------------------------+- ------------------------+
Това е имплицитно преобразуване, защото не използваме функция за преобразуване (като тези по-долу), за да я преобразуваме изрично. В този случай SQL Server изпълнява имплицитно преобразуване зад кулисите, когато се опитваме да присвоим datetimeoffset стойност към дата и час променлива.
Виждаме, че datetime променливата има по-малка прецизност на дробни секунди и в крайна сметка получаваме дробна част от 123 въпреки че оригиналната дробна част беше 1234567 .
В този случай не е извършено закръгляване.
Виждаме също, че изместването на часовата зона е съкратено. Дата и час типът данни няма информация за часовата зона.
При това преобразуване размерът на паметта е намалял от 10 байта (11 байта, ако включите допълнителния байт, който съхранява точността) за datetimeoffset , до 8 байта за дата и час . Въпреки това, ако datetimeoffset value е използвал скала между 0 и 2, би използвал само 8 байта (9 включително прецизност).
Ако е използвал скала от 3 (еквивалент на дата и час стойност), размерът на съхранение би бил 9 байта (10 с точност). Точността му обаче би била по-висока от datetime . Разбира се, точността ще бъде намалена веднага след като я преобразуваме в datetime .
Пример 2 – Прецизност/точност и закръгляване
Дата и час типът данни се закръглява до стъпки от .000, .003 или .007 секунди. Дори ако изрично го зададете на друга стойност, тя ще бъде закръглена.
Това важи и при конвертиране от друг тип данни (като това, което правим тук).
Ето пример, който демонстрира какво имам предвид.
ДЕКЛАРИРАЙТЕ @thedatetimeoffset datetimeoffset, @thedatetime datetime;SET @thedatetimeoffset ='2025-05-21 10:15:30.1250000 +07:00';SET @thedatetime =@thedatetimeoffset;ИЗБЕРЕТЕ ИЗКЛЮЧЕНО @thedatetime'datetime КАТО 'datetime';
Резултат:
+----------------------------------+-------- ----------------+| datetimeoffset | дата и час ||------------------------------------+---------- ---------------|| 2025-05-21 10:15:30.1250000 +07:00 | 2025-05-21 10:15:30.127 |+------------------------------------+- ------------------------+
В този пример зададох частните секунди на datetimeoffset стойност до 1250000
но дата и час закръгли го до
127
(тъй като може да се закръгля само до стъпки от .000, .003 или .007 секунди).
Пример 3 – Изрично преобразуване с помощта на CAST()
Ето пример за изрично преобразуване. В този случай използвам CAST()
функция директно в SELECT
изявление за изрично преобразуване между datetimeoffset и дата и час .
DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';ИЗБЕРЕТЕ @thedatetimeoffset КАТО 'datetimeoffset', CAST(@thedatetime)offset AS;'date AS дата /предварително>Резултат:
+----------------------------------+-------- ----------------+| datetimeoffset | дата и час ||------------------------------------+---------- ---------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 |+------------------------------------+- ------------------------+Пример 4 – Изрично преобразуване с помощта на CONVERT()
Ето пример за изрично преобразуване с помощта на
CONVERT()
функция вместоCAST()
.DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SELECT @thedatetimeoffset КАТО 'datetimeoffset', CONVERT(datetime, @thedate) AS; /предварително>Резултат:
+----------------------------------+--------- ----------------+| datetimeoffset | дата и час ||------------------------------------+---------- ---------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 |+------------------------------------+- ------------------------+