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

日付には数値表現があります。の数値表現は'1/1/1901 12:00:00 AM'0SQL Server では , です。

として表すことができる日付と である日付を区別する能力を失うことなく、 の結果ISNULL(@date,0)を比較することはできません。00NULL

于 2009-06-23T09:55:50.853 に答える
2

以下のコード行は誤解を招きます。

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

この行は、 null の場合ではなく@date、 == 0 の場合に 0 を返します。指定した日付は、datetime に 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 に答える