Диапазон типов даты SQL не соответствует спецификации?
-
06-07-2019 - |
Вопрос
Согласно MSDN диапазон для типа данных date составляет с 1 января 1753 года по 31 декабря 9999 года
В SQL2005 интересно следующее:
declare @date as datetime
SET @date = '1/1/1901 12:00:00 AM'
SELECT @date
if (isnull(@date,0) = 0) SELECT 'date is null' ELSE SELECT 'date not null'
измените дату на '1/1/1901 12:00:00 AM'
и вдруг isnull(@date,0)
равно 0.
Что я упускаю из виду?
(Редактировать) исправлен диапазон дат для sql2005, ссылка на sql2005 BOL
Решение
Попробуйте это:
declare @date as datetime
SET @date = '1/1/1901 12:00:00 AM'
SELECT @date, CASE WHEN @date IS NULL THEN 'date is null' ELSE 'date not null' END
Другие советы
declare @date as datetime
SET @date = '1/1/1901 12:00:00 AM'
SELECT @date
if @date is null SELECT 'date is null' ELSE SELECT 'date not null'
ISNULL()
является функцией преобразования.Это не проверка того, является ли значение NULL
.
Дата имеет числовое представление.Числовое представление '1/1/1901 12:00:00 AM'
случается, что это 0
, на SQL Server.
Вы не можете сравнить результат ISNULL(@date,0)
Для 0
не теряя способности различать дату, которая могла бы быть представлена в виде 0
и дата , которая есть NULL
.
Строка кода ниже вводит в заблуждение:
if (isnull(@date,null) = 0) SELECT 'date is null' ELSE SELECT 'date not null'
Эта строка возвращает 0, если @date
== 0, не , когда она пуста. Указанная вами дата сохраняется как 0 в дате и времени.
SELECT convert(datetime, 0)
чтобы понять, что я имею в виду!
Я попробовал это:
declare @date as datetime
SET @date = '1/1/1901 12:00:00 AM'
SELECT @date, CONVERT(numeric(9,3), @date) as DateValue
if (isnull(@date,0) = 0) SELECT 'date is zero' ELSE SELECT 'date not equal to zero (THIS PRINTS)'
if (isnull(@date,0) = 365) SELECT 'date is 365 (THIS PRINTS)' ELSE SELECT 'date not equal to zero'
if (@date = 365) SELECT 'date is 365 (THIS PRINTS)' ELSE SELECT 'date not 365'
SET @date = '1/1/1900 12:00:00 AM'
SELECT @date, CONVERT(numeric(9,3), @date) as DateValue
if (isnull(@date,0) = 0) SELECT 'date is equal to Zero (THIS PRINTS)' ELSE SELECT 'date not null'
if (@date = 0) SELECT 'date is equal to Zero (THIS PRINTS)' ELSE SELECT 'date not null'
Ничего не так с ISNULL и с COALESCE. Проблема в том, что вы сравниваете с нулем, и вы обманываете себя, думая, что ISNULL сработал. Попробуйте мой код и убедитесь, что ISNULL возвращает правильное значение.