100万件以上のレコードがある大きなテーブルがあります。残念ながら、テーブルを作成した人は、varchar(50)
フィールドに日付を入力することにしました。
簡単な日付比較を行う必要があります-
datediff(dd, convert(datetime, lastUpdate, 100), getDate()) < 31
しかし、それは失敗しますconvert()
:
Conversion failed when converting datetime from character string.
どうやらその分野には嫌いなものがあり、レコードが多いので見ただけではわかりません。日付フィールド全体を適切にサニタイズして、失敗しないようにするにはどうすればよいconvert()
ですか?これが私が今持っているものです:
select count(*)
from MyTable
where
isdate(lastUpdate) > 0
and datediff(dd, convert(datetime, lastUpdate, 100), getDate()) < 31
この場合、パフォーマンスについては気にしません。これは1回限りのクエリになります。テーブルを日時フィールドに変更することはオプションではありません。
3番目の引数を追加しようとしましたが、違いはありません。
問題は、データの保存方法にある可能性が最も高く、安全な形式は2つだけです。ISO YYYYMMDD; ISO 8601 yyyy-mm-dd Thh:mm:ss:mmm(スペースなし)
チェックはこれを処理しませんisdate()
か?
100%の精度は必要ありません。過去30日間のレコードのほとんどを取得したいだけです。
select isdate('20080131') -- returns 1
select isdate('01312008') -- returns 0
CASEとISDATEをCONVERT()関数内に配置します。
ありがとう!それはそれをしました。