Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment identifier les valeurs non valides (corrompues) stockées dans les colonnes Oracle DATE

C'est un scénario assez inhabituel (bien que j'aie rencontré quelque chose de similaire une fois auparavant). Le problème le plus courant est de trouver des dates non valides qui sont conservées sous forme de chaînes dans une colonne de date. Vous pouvez adapter la solution pour cela à votre situation, en créant votre propre validateur de date.

Quelque chose comme ça :

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

Cela convertit une date en une chaîne et inversement. Il intercepte les exceptions levées par le casting de date. Si le produit final n'est pas le même que la date d'entrée, il est probable que quelque chose s'est perdu dans la traduction ; pour être honnête, je ne suis pas sûr que la date 12011 soit correctement projetée sur une chaîne, il s'agit donc d'une approche ceinture et bretelles. C'est un peu délicat d'écrire cet utilitaire sans quelques données de test !

Cette requête identifierait toutes les dates non valides :

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