Тази статия съдържа примери за преобразуване на дата стойност до smalldatetime стойност в SQL Server.
Когато конвертирате дата стойност на smalldatetime , към стойността се добавя допълнителна информация. Това е така, защото малката дата типът данни съдържа както информация за дата, така и за час. Датата типът данни, от друга страна, съдържа само информация за дата.
Има обаче случаи, в които едатата до smalldatetime преобразуването може да не успее. По-специално, ако надатата стойността е извън диапазона, поддържан от smalldatetime тогава ще се провали с грешка.
Във всеки случай, по-долу са дадени примери за преобразуване между тези два типа данни.
Пример 1 – Неявно преобразуване
Ето пример за имплицитно преобразуване между дата и smalldatetime .
DECLARE @thedate date, @thesmalldatetime smalldatetime SET @thedate = '2020-12-01' SET @thesmalldatetime = @thedate SELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';
Резултат:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 00:00:00 | +------------+---------------------+
Това е имплицитно преобразуване, защото не използваме функция за преобразуване (като тези по-долу), за да я преобразуваме изрично. В този случай SQL Server извършва имплицитно преобразуване зад кулисите, когато се опитваме да присвоим дата стойност до smalldatetime променлива.
Виждаме, че датата променливата съдържа само информация за дата, докато smalldatetime променливата съдържа информация за дата и час.
Когато конвертирате между дата и smalldatetime , компонентът за време е настроен на 00:00:00
. Това осигурява точност до минута.
Причината, поради която всички са нули, е, че стойността на датата не съдържа никаква информация за времето, така че няма начин SQL Server да знае колко часа искате (ако има такъв).
Разбира се, вие също получавате този резултат, дори ако просто присвоите стойност само за дата на smalldatetime без извършване на преобразуване:
DECLARE @thesmalldatetime smalldatetime = '2020-12-01' SELECT @thesmalldatetime AS 'smalldatetime';
Резултат:
+---------------------+ | smalldatetime | |---------------------| | 2020-12-01 00:00:00 | +---------------------+
Пример 2 – Промяна на времето
Ако трябва да посочите час (но да запазите същата дата), можете да използвате DATEADD()
функция да направи точно това.
DECLARE @thedate date, @thesmalldatetime smalldatetime SET @thedate = '2020-12-01' SET @thesmalldatetime = @thedate SET @thesmalldatetime = DATEADD(hour, 7, @thesmalldatetime) SELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';
Резултат:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 07:00:00 | +------------+---------------------+
Пример 3 – Изрично преобразуване с помощта на CAST()
Ето пример за изрично преобразуване. В този случай използвам CAST()
функция директно в SELECT
изявление за изрично преобразуване между дата и smalldatetime .
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';
Резултат:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 00:00:00 | +------------+---------------------+
Същият резултат като имплицитното преобразуване.
Можем също така да коригираме времето по следния начин:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(hour, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';
Резултат:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 07:00:00 | +------------+---------------------+
Пример 4 – Изрично преобразуване с помощта на CONVERT()
Ето пример за изрично преобразуване с помощта на CONVERT()
функция вместо CAST()
.
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CONVERT(smalldatetime, @thedate) AS 'smalldatetime';
Резултат:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 00:00:00 | +------------+---------------------+
И коригиране на часа:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(hour, 7, CONVERT(smalldatetime, @thedate)) AS 'smalldatetime';
Резултат:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 07:00:00 | +------------+---------------------+
Пример 5 – Грешка извън обхвата
Както споменахме, ако датата е извън диапазона, поддържан от smalldatetime тип данни, ще получите грешка.
DECLARE @thedate date SET @thedate = '2080-12-01' SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';
Резултат:
The conversion of a date data type to a smalldatetime data type resulted in an out-of-range value.
Smalldatetime типът данни поддържа само периоди от време от 1900-01-01 до 2079-06-06.
Също така, smalldatetime типът данни поддържа само времеви диапазони от 00:00:00 до 23:59:59, така че ще получите и грешка, ако се опитате да използвате стойност извън този диапазон (например с по-висока точност).
Пример:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(nanosecond, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';
Резултат:
The datepart nanosecond is not supported by date function dateadd for data type smalldatetime.
В този случай обаче това не е грешка при конвертиране, а всъщност е грешка при използване на DATEADD()
функция (тъй като функцията не позволява тази конкретна част от дата да се използва за малка дата и време тип данни).