2009-06-23 29 views
0

MSDN日期數據類型的範圍是1753年1月1日,通過9999SQL日期類型範圍不符合規範?

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

這與您實際發佈的內容無關,但請注意,鏈接到的MSDN頁面是針對'date'數據類型(SQL 2008中的新增內容),而您的代碼使用'datetime'。 – AakashM 2009-06-23 09:57:17

+0

固定。感謝您指出。 – callisto 2009-06-23 10:02:21

回答

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 
2

的下面代碼行是誤導性:

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

此行返回0如果@date == 0,當它一片空白。您指定的日期在日期時間中存儲爲0。

SELECT convert(datetime, 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

日期具有數字表示形式。 '1/1/1901 12:00:00 AM'的數字表示恰巧是在SQL Server上的0

不能不失,可以被表示爲0的日期,這是NULL日期區分的能力ISNULL(@date,0)結果比較0

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