Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como identificar valores inválidos (corrompidos) armazenados em colunas Oracle DATE


Este é um cenário bastante incomum (embora eu já tenha encontrado algo semelhante antes). O problema mais comum é encontrar datas inválidas que são mantidas como strings em uma coluna de data. Você pode adaptar a solução para isso à sua situação, construindo seu próprio validador de data.

Algo assim:
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;
/ 

Isso converte uma data em uma string e vice-versa. Ele captura exceções lançadas pela conversão de data. Se o produto final não for o mesmo que a data de entrada, presumivelmente algo se perdeu na tradução; para ser honesto, não tenho certeza se a data de 12011 seria lançada com sucesso em uma string, então essa é uma abordagem de cinto e chave. É um pouco complicado escrever este utilitário sem alguns dados de teste!

Esta consulta identificaria todas as datas inválidas:
 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';