0

根据MSDN,日期数据类型的范围是 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

4 回答 4

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

于 2009-06-23T09:55:50.853 回答
2

下面的代码行具有误导性:

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

@date如果== 0,则此行返回 0 ,而不是当它为空时。您指定的日期在日期时间中存储为 0。

SELECT convert(datetime, 0)

看看我的意思!

于 2009-06-23T09:52:46.133 回答
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
于 2009-06-23T09:56:29.683 回答
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 返回正确的值。

于 2009-06-23T10:40:32.277 回答