2016-09-22 15 views
0

テーブルから6か月以上経過したすべての行を削除しようとしています。where句の内部:IsDate()がtrueの場合にのみ部分文字列を日付としてキャストする

問題は、日付がvarchar列の部分文字列を使用して取得され、常に有効な日付ではないことです。ここで

が失敗しているクエリです:ここでは

Delete ExampleDatesTable 
where CONVERT(datetime, SUBSTRING(DateField, LEN(DateField) - 18, 19)) < DATEADD(month, -6, GETDATE()) 

は私がしようとしているものですが、それが動作していません。

Delete ExampleDatesTable 
where IsDate(SUBSTRING(DateField, LEN(DateField) - 18, 19)) = 1 
AND CONVERT(datetime, SUBSTRING(DateField, LEN(DateField) - 18, 19)) < DATEADD(month, -6, GETDATE()) 

はこれを回避する方法はありますか?

+0

サンプルデータを表示できますか? –

+1

使用しているSQL Serverのバージョンは何ですか?有効な日付ではない行で何をしたいですか? –

+0

行が有効な日付でない場合は、それらをスキップします – cjw

答えて

1

有効なレコードを最初に選択し、日付に基づいて削除することができます。

WITH data AS (
    SELECT * FROM ExampleDatesTable 
    WHERE ISDATE(SUBSTRING(DateField,LEN(DateField) - 18,19)) = 1 
) 
DELETE data 
WHERE CONVERT(DATETIME,SUBSTRING(DateField,LEN(DateField) - 18,19)) < DATEADD(month,-6,GETDATE()) 
+0

SUBSTRING関数を呼び出す前にDateFieldの長さが19より大きいかどうかをチェックしたい場合は、別のWith As()ステートメントを使用することをお勧めします – cjw

+0

それを 'data'のどこに入れるのですか? – JamieD77

関連する問題