Тази статия съдържа примери за преобразуване на дата и час стойност до smalldatetime стойност в SQL Server.
Едно от предимствата на преобразуването на дата и час стойност на smalldatetime е, че намалявате размера на съхранение от 8 байта на 4 байта. Въпреки това губите прецизност за това.
Дата и час типът данни включва 3-цифрена част от секундите. Неговата точност се закръглява до стъпки от .000, .003 или .007 секунди.
Smalldatetime тип данни от друга страна, няма частни секунди и неговият компонент за секунди винаги е настроен на нула (:00). Освен това има точност само до най-близката минута.
Когато конвертирате дата и час стойност на smalldatetime , датата и частта от часа се копират. Компонентът за секунди е настроен на нула (независимо от първоначалната стойност) и времето се закръглява до най-близката минута. Всички части от секундите се премахват.
Пример 1 – Неявно преобразуване
Ето пример за имплицитно преобразуване между дата и час и smalldatetime .
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.123'; SET @thesmalldatetime = @thedatetime; SELECT @thedatetime AS 'datetime', @thesmalldatetime AS 'smalldatetime';
Резултат:
+-------------------------+---------------------+ | datetime | smalldatetime | |-------------------------+---------------------| | 2025-05-21 10:15:30.123 | 2025-05-21 10:16:00 | +-------------------------+---------------------+
Това е имплицитно преобразуване, защото не използваме функция за преобразуване (като тези по-долу), за да я преобразуваме изрично. В този случай SQL Server извършва имплицитно преобразуване зад кулисите, когато се опитваме да присвоим datetime стойност до smalldatetime променлива.
В този пример можем да видим, че smalldatetime стойността не включва дробните секунди, секундите са зададени на нула, а минутата е закръглена нагоре.
Пример 2 – Изрично преобразуване с помощта на CAST()
Ето пример за изрично преобразуване. В този случай използвам CAST()
функция директно в SELECT
изявление за изрично преобразуване между datetime и smalldatetime .
DECLARE @thedatetime datetime; SET @thedatetime = '2025-05-21 10:15:30.125'; SELECT @thedatetime AS 'datetime', CAST(@thedatetime AS smalldatetime) AS 'smalldatetime';
Резултат:
+-------------------------+---------------------+ | datetime | smalldatetime | |-------------------------+---------------------| | 2025-05-21 10:15:30.127 | 2025-05-21 10:16:00 | +-------------------------+---------------------+
Може би сте забелязали, че в този пример промених частичните секунди, когато присвоих началната стойност на @thedatetime
. Но защото го присвоявам на дата и час тип данни, частта от секундите се закръглява нагоре (тъй като нейната точност е закръглена до стъпки от .000, .003 или .007 секунди). В този случай се опитвам да задам част от секунди от 125
но се закръглява до 127
.
Това обаче не засяга smalldatetime стойност.
Пример 3 – Изрично преобразуване с помощта на CONVERT()
Ето пример за изрично преобразуване с помощта на CONVERT()
функция вместо CAST()
.
DECLARE @thedatetime datetime; SET @thedatetime = '2025-05-21 10:15:30.125'; SELECT @thedatetime AS 'datetime', CONVERT(smalldatetime, @thedatetime) AS 'smalldatetime';
Резултат:
+-------------------------+---------------------+ | datetime | smalldatetime | |-------------------------+---------------------| | 2025-05-21 10:15:30.127 | 2025-05-21 10:16:00 | +-------------------------+---------------------+