Диапазон типов даты SQL не соответствует спецификации?

StackOverflow https://stackoverflow.com/questions/1031594

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top