4

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で正しく定義されていませんか(したがって、実際には少し誤称です)?

4

1 に答える 1

3

IsDateもIsNumericも、実際には値を問題の型に変換しようとはしません。代わりに、問題の値が日付または数値に変換できるように見えるかどうかを通知します。SQL Server 2012は、TRY_PARSE関数を使用してこれに対処しています。暫定的に、データのクリーンアップを実行するか、そのクリーンアップを実行する関数を作成する必要があります。

于 2012-05-06T17:00:52.787 に答える