Диапазон дат типа SQL не соответствует спецификации? - PullRequest
0 голосов
/ 23 июня 2009

Согласно MSDN диапазон для типа данных даты - с 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

Ответы [ 4 ]

3 голосов
/ 23 июня 2009
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' в SQL Server составляет 0.

Вы не можете сравнить результат ISNULL(@date,0) с 0 без потери способности различать дату, которая может быть представлена ​​как 0, и дату, которая NULL.

2 голосов
/ 23 июня 2009

Попробуйте это:

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
2 голосов
/ 23 июня 2009

Строка кода ниже вводит в заблуждение:

if (isnull(@date,null) = 0) SELECT 'date is null' ELSE SELECT 'date not null'

Эта строка возвращает 0, если @date == 0, , а не , когда она пуста. Указанная вами дата хранится как 0 в дате и времени.

SELECT convert(datetime, 0)

чтобы понять, что я имею в виду!

1 голос
/ 23 июня 2009

Я пробовал это:

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 возвращает правильное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...