SQL日期类型范围不符合规范?

时间:2009-06-23 09:47:12

标签: sql datetime date-range isnull

根据MSDN,date数据类型的范围是1753年1月1日到9999年12月31日

在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 个答案:

答案 0 :(得分:3)

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,则不检查。

日期有数字表示。 SQL Server上'1/1/1901 12:00:00 AM'的数字表示恰好是0

您无法将ISNULL(@date,0)0的结果进行比较,同时又无法区分可以表示为0的日期和NULL的日期}。

答案 1 :(得分:2)

以下代码行具有误导性:

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

如果@date == 0,,则该行返回0。您指定的日期在日期时间中存储为0。

SELECT convert(datetime, 0)

看看我的意思!

答案 2 :(得分:2)

试试这个:

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

答案 3 :(得分:1)

我试过了:

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返回正确的值。