Тази статия съдържа примери за преобразуване на smalldatetime стойност до datetime2 стойност в SQL Server.
Smalldatetime типът данни няма частни секунди и неговият компонент за секунди винаги е настроен на нула (:00). Неговата точност е до най-близката минута.
datetime2 тип данни, от друга страна, ви позволява да зададете частична точност от секунди от 0 до 7. Ако не посочите това, той ще използва 7 (по подразбиране). Ако посочите нула (0
), точността му ще бъде до най-близката секунда.
Когато конвертирате smalldatetime стойност на datetime2 , часовете и минутите се копират. Секундите и частичните секунди са зададени на 0.
Пример 1 – Неявно преобразуване
Ето пример за имплицитно преобразуване между smalldatetime и дата и час2 .
DECLARE @thesmalldatetime smalldatetime, @thedatetime2 datetime2; SET @thesmalldatetime = '2025-05-21 10:15:30'; SET @thedatetime2 = @thesmalldatetime; SELECT @thesmalldatetime AS 'smalldatetime', @thedatetime2 AS 'datetime2';
Резултат:
+---------------------+-----------------------------+ | smalldatetime | datetime2 | |---------------------+-----------------------------| | 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 | +---------------------+-----------------------------+
Това е имплицитно преобразуване, защото не използваме функция за преобразуване (като тези по-долу), за да я преобразуваме изрично. В този случай SQL Server изпълнява неявно преобразуване зад кулисите, когато се опитваме да присвоим smalldatetime стойност до datetime2 променлива.
В този пример можем да видим, че smalldatetime стойността не включва дробните секунди, секундите са зададени на нула, а минутата е закръглена нагоре.
В този случай datetime2 value използва точност от 7. Това е така, защото 7 е стойността по подразбиране. Не посочих точност и затова беше използвана стойността по подразбиране. Това води до използване на 7 нули в дробната част.
Пример 2 – Премахване на дробната част
Можете да премахнете частичните секунди, ако е необходимо. За да направите това, просто използвайте datetime2(0)
при деклариране на променливата.
DECLARE @thesmalldatetime smalldatetime, @thedatetime2 datetime2(0); SET @thesmalldatetime = '2025-05-21 10:15:30'; SET @thedatetime2 = @thesmalldatetime; SELECT @thesmalldatetime AS 'smalldatetime', @thedatetime2 AS 'datetime2';
Резултат:
+---------------------+---------------------+ | smalldatetime | datetime2 | |---------------------+---------------------| | 2025-05-21 10:16:00 | 2025-05-21 10:16:00 | +---------------------+---------------------+
Така че в този случай и двата типа данни връщат една и съща стойност. Разликата обаче е, че datetime2 има способността да предоставя точност на втория (в сравнение с smalldatetime точност до минута).
Пример:
DECLARE @thesmalldatetime smalldatetime, @thedatetime2 datetime2(0); SET @thesmalldatetime = '2025-05-21 10:15:30'; SET @thedatetime2 = @thesmalldatetime; SELECT DATEADD(second, 30, @thesmalldatetime) AS 'smalldatetime', DATEADD(second, 30, @thedatetime2) AS 'datetime2';
Резултат:
+---------------------+---------------------+ | smalldatetime | datetime2 | |---------------------+---------------------| | 2025-05-21 10:17:00 | 2025-05-21 10:16:30 | +---------------------+---------------------+
В този пример използвах DATEADD()
функция за добавяне на 30 секунди към всяка стойност. Въпреки това, всеки тип данни връща различен резултат. datetime2 типът данни зачита секундната част и осигурява правилния резултат със 100% точност. Smalldatetime от друга страна, се закръглява нагоре до най-близката минута (докато частта от секундите остава на нула).
Пример 3 – Изрично преобразуване с помощта на CAST()
Ето пример за изрично преобразуване. В този случай използвам CAST()
функция директно в SELECT
изявление за изрично преобразуване между smalldatetime и дата и час2 .
DECLARE @thesmalldatetime smalldatetime; SET @thesmalldatetime = '2025-05-21 10:15:30'; SELECT @thesmalldatetime AS 'thesmalldatetime', CAST(@thesmalldatetime AS datetime2(0)) AS 'datetime2(0)';
Резултат:
+---------------------+---------------------+ | thesmalldatetime | datetime2(0) | |---------------------+---------------------| | 2025-05-21 10:16:00 | 2025-05-21 10:16:00 | +---------------------+---------------------+
Пример 4 – Изрично преобразуване с помощта на CONVERT()
Ето пример за изрично преобразуване с помощта на CONVERT()
функция вместо CAST()
.
DECLARE @thesmalldatetime smalldatetime; SET @thesmalldatetime = '2025-05-21 10:15:30'; SELECT @thesmalldatetime AS 'thesmalldatetime', CONVERT(datetime2(0), @thesmalldatetime) AS 'datetime2(0)';
Резултат:
+---------------------+---------------------+ | thesmalldatetime | datetime2(0) | |---------------------+---------------------| | 2025-05-21 10:16:00 | 2025-05-21 10:16:00 | +---------------------+---------------------+