12

Excel ファイルからインポートしたデータに対して SQL ステートメントを実行しています。この SQL では、ユーザーが IsDate 関数を使用して日付を正しく入力したかどうかを確認しています。これはまだ変換されていない生データであるため、すべての日付は varchar データ型フィールドに格納されます。

状況によっては、ユーザーが入力した日付形式が明らかに正しくない場合、IsDate は 1 (有効な日付) を返します。

例えば:

07/001/2012

2012-07-002

007/002/2012

この問題を処理する方法について何か提案はありますか?

SELECT *
  FROM tblImport
 WHERE (ISDATE(dt) = 0 
        AND (dt is not null AND dt <> ''))

ありがとう!

ps Smacking ユーザーは役に立ちませんでした。

4

3 に答える 3

23

私は多くのデータ変換作業を行っていますが、これは私が作成し、実際に毎日使用して悪い日付を取り除く関数です。

CREATE FUNCTION dbo.fnCheckDate
(@InDate nvarchar(50))
RETURNS DATETIME
AS
    BEGIN
        declare @Return DATETIME

        select @return = CASE WHEN ISDATE(@InDate) = 1
                            THEN CASE WHEN CAST(@InDate as DATETIME) BETWEEN '1/1/1901 12:00:00 AM' AND '6/6/2079 12:00:00 AM'
                                    THEN @InDate
                                    ELSE null
                                    END
                            ELSE null
                            END
        return @return
    END
GO

結果:

SELECT dbo.fnCheckDate('07/001/2012') --> Returns 2012-07-01 00:00:00.000
SELECT dbo.fnCheckDate('2012-07-002') --> Returns 2012-07-01 00:00:00.000
SELECT dbo.fnCheckDate('007/002/2012') --> Returns 2012-07-01 00:00:00.000
SELECT dbo.fnCheckDate('00/002/2012') --> Returns Null
SELECT dbo.fnCheckDate('006/031/2012') --> Returns Null
SELECT dbo.fnCheckDate('') --> Returns Null
于 2012-07-31T17:50:12.583 に答える
1

dt の LEN を確認してみてはいかがでしょうか。ただし、len が有効な場合は処理できません。多分入力の検証はフロントエンドで行われるべきですか?

于 2012-07-31T17:31:05.773 に答える