根据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
答案 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返回正确的值。