SQL日期类型范围不符合规范?
-
06-07-2019 - |
题
根据 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返回正确的值。
不隶属于 StackOverflow