SQLの日付型の範囲は仕様に準拠していませんか?
-
06-07-2019 - |
質問
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が正しい値を返すことを確認してください。
所属していません StackOverflow