AccessデータベースからSQLServerデータベースへのデータの変換と正規化中に、興味深い問題が発生しました。ISDATE()は、テキストを日付にキャストできるかどうかを正常に予測できないようです。
SELECT 'This will return an error' =
CASE
WHEN ISDATE('1/1-2010') = 1 THEN CAST('1/1-2010' AS date)
ELSE NULL
END
ISDATE()MSDNの記事には、関数が「式が有効な日付、時刻、または日時の値である場合は1、それ以外の場合は0」を返すと記載されているため、これは少し奇妙だと思いました。
私の知る限り、このエラーはSETDATEFORMATまたはSETLANGUAGEのいずれかで遊んでも軽減されません。
また、CONVERT()の結果がCAST()と異なるようには見えません。
幸い、ISDATE()は、テキストを日時に変換できるかどうかを正常に予測します。
SELECT 'This will return a datetime' =
CASE
WHEN ISDATE('1/1-2010') = 1 THEN CAST('1/1-2010' AS datetime)
ELSE NULL
END
したがって、日時にキャストしてから日付にキャストするという回避策を使用できます。
SELECT 'This will return a date' =
CASE
WHEN ISDATE('1/1-2010') = 1 THEN CAST(CAST('1/1-2010' AS datetime) as date)
ELSE NULL
END
しかし、何かが足りないのではないかと思います。テキストを日付にキャストするためのよりクリーンな方法はありますか?当然の結果として、ISDATE()関数はMSDNで正しく定義されていませんか(したがって、実際には少し誤称です)?