sql >> Database >  >> RDS >> Oracle

Hoe ongeldige (corrupte) waarden te identificeren die zijn opgeslagen in Oracle DATE-kolommen?

Dit is een vrij ongebruikelijk scenario (hoewel ik iets soortgelijks al eerder ben tegengekomen). Het meest voorkomende probleem is het vinden van ongeldige datums die als strings in een datumkolom worden vastgehouden. U kunt de oplossing daarvoor aanpassen aan uw situatie, door uw eigen datumvalidator te bouwen.

Zoiets als dit:

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;
/ 

Dit zet een datum om in een string en weer terug. Het vangt uitzonderingen op die worden veroorzaakt door date-casting. Als het eindproduct niet overeenkomt met de invoerdatum dan is er vermoedelijk iets verloren gegaan in de vertaling; om eerlijk te zijn weet ik niet zeker of de 12011-datum met succes naar een string zou worden gegoten, dus dit is een belt'n'braces-benadering. Het is een beetje lastig om dit hulpprogramma te schrijven zonder wat testgegevens!

Deze zoekopdracht zou alle ongeldige datums identificeren:

 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';


  1. NAMEN INSTELLEN utf8 in MySQL?

  2. Hoe detecteer je dat de transactie al is gestart?

  3. SQL, een tabel maken

  4. opatchvoorwaarde