2012-07-31 4 views
11

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

ユーザーによって入力された日付形式が間違っていると、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 <> '')) 

ありがとうございます!

p.s.スマッシングユーザーは役に立たなかった。

+0

いいえc#。 SQLビュー。無効な日付のレコードを返します。 – ssokol91

答えて

21

私は、データ変換作業の多くを行うと、ここで私が作成した関数であり、悪い日を取り除くために、日常実質的にそれを使用します。

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 
+1

これは素晴らしいことです! ありがとう! – ssokol91

+2

+1しかし、なぜあなたはSQLを使って1/2/2030に終わるのですかsmalldatetime行く2079-06-06 – Paparazzi

+1

私は長い死んで埋葬される(LOL)ので2030年までに!私が扱うデータはすべて歴史的なものなので、将来の日付は心配する必要はありませんが、大きなポイントです。 –

1

おそらくdtのLENをチェックしますか?ただし、lenが有効な場合は処理できません。多分入力の検証はフロントエンドで行われるべきでしょうか?

+0

入力の検証が私の最初の防衛線でした。残念ながら、すべてのデータ入力はExcelファイルで行われているため、不注意なユーザーの可能性を知っています。単純に不可能でした。 – ssokol91

6

を設定してみてください最初にdateformatがありました。

set dateformat dmy 
select IsDate(<column>) 
from Table 
関連する問題