sql >> Base de Datos >  >> RDS >> Oracle

Cómo identificar valores inválidos (dañados) almacenados en columnas DATE de Oracle

Este es un escenario bastante inusual (aunque me he encontrado con algo similar una vez antes). El problema más común es encontrar fechas no válidas que se mantienen como cadenas en una columna de fecha. Puede adaptar la solución para eso a su situación, construyendo su propio validador de fecha.

Algo como esto:

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

Esto convierte una fecha en una cadena y viceversa. Atrapa las excepciones lanzadas por la conversión de fechas. Si el producto final no es el mismo que la fecha de entrada, presumiblemente algo se perdió en la traducción; para ser honesto, no estoy seguro de si la fecha 12011 se transmitiría con éxito a una cadena, por lo que este es un enfoque de cinturón y llaves. ¡Es un poco complicado escribir esta utilidad sin algunos datos de prueba!

Esta consulta identificaría todas las fechas no vá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';