質問

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へのリンク

役に立ちましたか?

解決

これを試してください:

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 かどうかのチェックではありません。

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

ISNULL(@ date、0)の結果を 0 と比較することはできません。 > 0 および NULL の日付。

以下のコード行は誤解を招くものです:

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

@date == 0の場合、この行は0を返し、nullの場合は not を返します。指定した日付は、日時に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