Dette er et ret usædvanligt scenarie (selvom jeg er stødt på noget lignende en gang før). Det mere almindelige problem er at finde ugyldige datoer, der holdes som strenge i en datokolonne. Du kan tilpasse løsningen til det til din situation ved at bygge din egen datevalidator.
Noget som dette:
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;
/
Dette konverterer en dato til en streng og tilbage igen. Den fanger undtagelser fra datocasting. Hvis slutproduktet ikke er det samme som inputdatoen, så er der formodentlig gået noget tabt i oversættelsen; for at være ærlig er jeg ikke sikker på, om 12011-datoen ville blive støbt til en streng, så dette er en belt'n'braces-tilgang. Det er lidt vanskeligt at skrive dette værktøj uden nogle testdata!
Denne forespørgsel identificerer alle de ugyldige datoer:
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';