これはかなり珍しいシナリオです(以前に似たようなものに出くわしたことがありますが)。より一般的な問題は、日付列に文字列として保持されている無効な日付を見つけることです。独自の日付バリデーターを構築することで、そのソリューションを状況に適合させることができます。
このようなもの:
create or replace function is_a_date
( p_date in date )
return varchar2
is
d date;
begin
d := to_date(to_char(p_date, 'SYYYYMMDDHH24MISS'), 'SYYYYMMDDHH24MISS') ;
if d != p_date then
return 'not a proper date';
else
return 'good date';
end if;
exception
when others then
return 'not a date';
end;
/
これにより、日付が文字列に変換され、元に戻ります。日付キャストによってスローされた例外をキャッチします。最終製品が入力日と同じでない場合は、おそらく翻訳で何かが失われました。正直なところ、12011年の日付が文字列にうまくキャストされるかどうかはわかりません。したがって、これはベルトとブレースのアプローチです。テストデータなしでこのユーティリティを作成するのは少し注意が必要です。
このクエリは、すべての無効な日付を識別します:
select h.id, dump(h.bid_close_date)
from mytable h
where h.bid_close_date is not null
and is_a_date(h.bid_close_date) != 'good date';