Oracle
 sql >> Database >  >> RDS >> Oracle

Come identificare i valori non validi (corrotti) archiviati nelle colonne Oracle DATE

Questo è uno scenario piuttosto insolito (anche se mi sono imbattuto in qualcosa di simile una volta prima). Il problema più comune è trovare date non valide che vengono mantenute come stringhe in una colonna della data. Potresti adattare la soluzione alla tua situazione, costruendo il tuo validatore di data.

Qualcosa del genere:

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

Questo converte una data in una stringa e viceversa. Cattura le eccezioni generate dal casting della data. Se il prodotto finale non è lo stesso della data di input, è probabile che qualcosa sia andato perso nella traduzione; ad essere onesto, non sono sicuro che la data del 12011 possa essere lanciata con successo su una corda, quindi questo è un approccio cintura e bretelle. È un po' complicato scrivere questa utility senza alcuni dati di test!

Questa query identificherebbe tutte le date non valide:

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