Тази статия съдържа примери за преобразуване на smalldatetime стойност към datetimeoffset стойност в SQL Server.
Когато конвертирате smalldatetime стойност на datetimeoffset , малката дата стойността се копира в datetimeoffset стойност. Частичните секунди са зададени на 0, а изместването на часовата зона е настроено на +00:0.
Smalldatetime типът данни няма частни секунди и неговият компонент за секунди винаги е настроен на нула (:00). Неговата точност е до най-близката минута.
отместването на датата и времето типът данни, от друга страна, ви позволява да зададете точност на частични секунди от 0 до 7. Ако не посочите това, той ще използва 7 (по подразбиране). Освен това има изместване на часовата зона и може да запази всякакви отмествания в оригиналната стойност. Въпреки това, smalldatetime няма осъзнаване на часовата зона, така че няма съществуващи стойности за запазване. В този случай изместването на часовата зона е настроено на +00:00.
SQL Server всъщност има TODATETIMEOFFSET()
функция, която е специално проектирана да преобразува стойност на дата/час в datetimeoffset и добавете изместване на часовата зона. Все пак вижте по-долу за моите коментари и някои примери относно тази опция.
Пример 1 – Неявно преобразуване
Първо, ето пример за имплицитно преобразуване между smalldatetime и datetimeoffset .
ДЕКЛАРИРАЙТЕ @thesmalldatetime smalldatetime, @thedatetimeoffset datetimeoffset(7);SET @thesmalldatetime ='2025-05-21 10:15:30';SET @thedatetimeoffset =@thesmalldatetime;SELECT @thesmalldatellda SELECT @thesmalldatellda ASte КАТО 'datetimeoffset(7)';
Резултат:
+---------------------+----------------------- ------------+| smalldatetime | datetimeoffset(7) ||---------------------+--------------------- --------------|| 21.05.2025 10:16:00 | 2025-05-21 10:16:00.0000000 +00:00 |+---------------------+----------- ------------------------+
Това е имплицитно преобразуване, защото не използваме функция за преобразуване (като тези по-долу), за да я преобразуваме изрично. В този случай SQL Server изпълнява неявно преобразуване зад кулисите, когато се опитваме да присвоим smalldatetime стойност към datetimeoffset променлива.
Можем да видим, че datetimeoffset променливата има дробна част ( 0000000 ), докато smalldatetime стойността няма дробна част и минутите й бяха закръглени нагоре при присвояването на първоначалната стойност. отместването на датата и времето стойността включва също отместване на часовата зона от +00:00 .
Използването на точност от 7 части от секунди причинява отместване на датата и времето да използвате 11 байта за съхранение (10 байта за съхранение на данните, 1 байт за прецизност). За сравнение, smalldatetime използва само 4 байта. Можете обаче да намалите точността на отместването на датата и времето стойност, като замените 7 с по-ниско число. Ако искате да премахнете частта от секундите изцяло, просто използвайте datetimeoffset(0)
. Това ще намали размера на съхранение до 9 байта (включително 1 за прецизност).
Пример 2 – Изрично преобразуване с помощта на CAST()
Ето пример за изрично преобразуване. В този случай използвам CAST()
функция директно в SELECT
изявление за изрично преобразуване между smalldatetime и datetimeoffset .
DECLARE @thesmalldatetime smalldatetime;SET @thesmalldatetime ='2025-05-21 10:15:30.125';SELECT @thesmalldatetime AS 'smalldatetime', CAST(@thesmalldatetime AS datetimeoffset(7)') AS datetimeoffset(7te);
Резултат:
+---------------------+----------------------- ------------+| smalldatetime | datetimeoffset(7) ||---------------------+--------------------- --------------|| 21.05.2025 10:16:00 | 2025-05-21 10:16:00.0000000 +00:00 |+---------------------+----------- ------------------------+
Пример 3 – Изрично преобразуване с помощта на CONVERT()
Ето пример за изрично преобразуване с помощта на CONVERT()
функция вместо CAST()
.
DECLARE @thesmalldatetime smalldatetime;SET @thesmalldatetime ='2025-05-21 10:15:30.125';SELECT @thesmalldatetime КАТО 'smalldatetime', CONVERT(datetimeoffset(7), @thesmalldatetime) ASset'7da';
Резултат:
+---------------------+----------------------- ------------+| smalldatetime | datetimeoffset(7) ||---------------------+--------------------- --------------|| 21.05.2025 10:16:00 | 2025-05-21 10:16:00.0000000 +00:00 |+---------------------+----------- ------------------------+
Пример 4 – Промяна на отместването на часовата зона
Фактът, че преобразувате своя smalldatetime стойности на datetimeoffset означава, че вероятно го правите за изместване на часовата зона. И е вероятно да искате да е настроен на различно отместване от +00:00 (отместването по подразбиране).
За щастие можете да използвате TODATETIMEOFFSET()
функция за промяна на отместването.
Можете също да използвате тази функция, за да конвертирате оригиналния smalldatetime стойност към datetimeoffset стойност. Тази функция приема стойност за дата/час (която може да се разреши до datetime2 стойност) и стойност на отместване.
Ето един пример:
DECLARE @thesmalldatetime smalldatetime, @thedatetimeoffset datetimeoffset;SET @thesmalldatetime ='2025-05-21 10:15:30';SET @thedatetimeoffset =TODATETIMEOFFSET(@thesmalldatetime, '+07:time ASthesma0ll:'smalldatetime', @thedatetimeoffset AS 'datetimeoffset';
Резултат:
+---------------------+----------------------- ------------+| smalldatetime | datetimeoffset ||---------------------+------------------------------ -----------|| 21.05.2025 10:16:00 | 2025-05-21 10:16:00.0000000 +07:00 |+---------------------+----------- ------------------------+
И ето пример за използване на функцията в SELECT
изявление:
DECLARE @thesmalldatetime smalldatetime ='2025-05-21 10:15:30';ИЗБЕРЕТЕ @thesmalldatetime КАТО 'smalldatetime', TODATETIMEOFFSET(@thesmalldatetime, '+07:00') КАТО 'datetimeoffset'Резултат:
+---------------------+----------------------- ------------+| smalldatetime | datetimeoffset ||---------------------+------------------------------ -----------|| 21.05.2025 10:16:00 | 2025-05-21 10:16:00.0000000 +07:00 |+---------------------+----------- ------------------------+Една важна точка за
TODATETIMEOFFSET()
функцията е, че използва същата дробна точност като предадения към нея аргумент дата/час. В този случай това е малка дата аргумент, който няма дробни секунди.Моята система връща крайни нули с datetimeoffset дробна част обаче може да видите нещо подобно:
+---------------------+----------------------- ----+| smalldatetime | datetimeoffset ||---------------------+------------------------------ ---|| 21.05.2025 10:16:00 | 2025-05-21 10:16:00 +07:00 |+---------------------+------------ ----------------+Така или иначе, все още можете да се възползвате напълно от отместването на датата и времето прецизност на типа данни, ако трябва да промените стойността по-късно.
Ето един пример, който използва
DATEADD()
функция за промяна на частичните секунди, след като преобразуването вече е извършено.DECLARE @thesmalldatetime smalldatetime, @thedatetimeoffset datetimeoffset(7);SET @thesmalldatetime ='2025-05-21 10:15:30';SET @thedatetimeoffset =TODATETIMEOFFSET(@thesmalldatetime:0'07); @thesmalldatetime AS 'smalldatetime', @thedatetimeoffset AS 'datetimeoffset', DATEADD(nanosecond, 123456700, @thedatetimeoffset) AS 'Modified';Резултат (с помощта на вертикален изход):
smalldatetime | 2025-05-21 10:16:00datetimeoffset | 21.05.2025 10:16:00.0000000 +07:00Променено | 2025-05-21 10:16:00.1234567 +07:00