根据 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

有帮助吗?

解决方案

试试这个:

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

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

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

以下代码行具有误导性:

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

如果 @date == 0, not ,则该行返回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