2016-12-05 24 views
12

MSドキュメント状態ISDATE()SQL Server 2012のISDATE()

1を返し、その式が有効な日付、時間、または日時の値である場合には、そうでない場合、0

以下の例では、なぜ0が返されますか?

DECLARE @DT VARCHAR(30) = '1/4/1752' 

SELECT 
    ISDATE(@DT), 
    TRY_CONVERT(DATE, @DT, 101), 
    TRY_CONVERT(DATETIME, @DT), 
    TRY_CAST(@DT as DATE), 
    TRY_CAST(@DT AS DATETIME) 

戻り

0 1752-01-04 NULL 1752-01-04 NULL 

1753に変更した日付をと...

1 1753-01-04 1753-01-04 00:00:00.000 1753-01-04 1753-01-04 00:00:00.000 

select ISDATE('17521231'), ISDATE('17530101') gives 

0 1 
+1

'17520401' *は有効な' DATETIME2'値ですが、有効な 'DATETIME'値ではないので' ISDATE'も0を返します.Gordonの示唆したような 'TRY_CONVERT'アプローチはこのケースをカバーします正しくも。 (そして、ドキュメンテーションはおそらく微調整が必​​要です - '17520401'は有効な' DATE'ですが、明らかに "有効な日付値"ではありません。) 'ISDATE'自体の動作は変更されない可能性があります下位互換性に関する懸念。 –

+0

http://stackoverflow.com/a/3310588/2975396 – TheGameiswar

+2

私はこれが重複していないと思います。ドキュメントの '日付/時刻データの範囲は1753-01-01から9999-12-31までですが、日付データの範囲は0001-01-01〜9999-12-31.'を返し、 '式が有効な日付、時刻、または日時の値であれば1を返します。そうでなければ、0. – TheGameiswar

答えて

13

としてはdocumentationで説明したが、早いdatetime値は '1753年1月1日' です。

代わりにtry_convert()を使用することをお勧めします。これはあなたに多くの柔軟性を提供します:

try_convert(date, '17521231') is not null 

dateデータ型は、年に1に戻ります。

+2

ドキュメントでは、最も早い日付が「日付データの範囲は0001-01-01から9999-12-31です」ans ISDATE()docは "式が有効な日付、時刻、またはdatetime値、それ以外の場合は0です。だから確実にISATE( '17520101')は有効な日付ですか? – Maurice1408

+0

年はゼロでした! – Cato