Тази статия съдържа примери за преобразуване на datetimeoffset стойност на smalldatetime в SQL Server.
Когато конвертирате datetimeoffset стойност на smalldatetime , датата и часовете се копират. Минутите се закръгляват нагоре (в зависимост от стойността на секундите) и секундите са зададени на 0.
отместването на датата и времето типът данни ви позволява да зададете частична точност от секунди от 0 до 7. Това се прави с помощта на datetimeoffset(n)
синтаксис. Ако не посочите това, той ще използва 7 (по подразбиране). Има и изместване на часовата зона. Размерът за съхранение на този тип данни е 8, 9 или 10 байта (плюс 1 байт за прецизността), в зависимост от използваната прецизност.
Smalldatetime тип данни, от друга страна, няма информация за часовата зона и следователно не включва изместване на часовата зона. Той също така няма частни секунди и неговият компонент за секунди винаги е настроен на нула (:00). Неговата точност е до най-близката минута. Размерът за съхранение на този тип данни е фиксиран на 4 байта.
Пример 1 – Неявно преобразуване
Ето пример за имплицитно преобразуване между datetimeoffset и smalldatetime .
DECLARE @thedatetimeoffset datetimeoffset, @thesmalldatetime smalldatetime;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SET @thesmalldatetime =@thesmalldatetime =@thesmalldatetime =@thesmalldatetime @thesmalldatetime smalldatetime; AS 'smalldatetime';
Резултат:
+----------------------------------+-------- ------------+| datetimeoffset | smalldatetime ||-----------------------------------+--------- -----------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:16:00 |+------------------------------------------------+- --------------------+
Това е имплицитно преобразуване, защото не използваме функция за преобразуване (като тези по-долу), за да я преобразуваме изрично. В този случай SQL Server изпълнява имплицитно преобразуване зад кулисите, когато се опитваме да присвоим datetimeoffset стойност до smalldatetime променлива.
Виждаме, че smalldatetime променливата няма точност на дробни секунди и нейните секунди са настроени на нула. Освен това минутите бяха закръглени нагоре, поради факта, че първоначалната стойност имаше стойност за секунди от 30.
Друго наблюдение е, че изместването на часовата зона е съкратено – smalldatetime типът данни няма информация за часовата зона.
При това преобразуване размерът на паметта е намалял от 10 байта (11 байта, когато преброите точността) за datetimeoffset , до 4 байта за smalldatetime .
Пример 2 – Изрично преобразуване с помощта на CAST()
Ето пример за изрично преобразуване. В този случай използвам CAST()
функция директно в SELECT
изявление за изрично преобразуване между datetimeoffset и smalldatetime .
DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';ИЗБЕРЕТЕ @thedatetimeoffset КАТО 'datetimeoffset', CAST(@thedatetimeoffset) КАТО малък дата и време;' /предварително>Резултат:
+----------------------------------+-------- ----------------+| datetimeoffset | smalldatetime ||-----------------------------------+--------- ---------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:16:00 |+------------------------------------------------+- ------------------------+Пример 3 – Изрично преобразуване с помощта на CONVERT()
Ето пример за изрично преобразуване с помощта на
CONVERT()
функция вместоCAST()
.DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SELECT @thedatetimeoffset КАТО 'datetimeoffset', CONVERT(thedatetimeoffset'mall AS) /предварително>Резултат:
+----------------------------------+-------- ----------------+| datetimeoffset | smalldatetime ||-----------------------------------+--------- ---------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:16:00 |+------------------------------------------------+- ------------------------+