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

Nettoyage de la colonne Oracle Date

C'est l'une des raisons pour lesquelles stocker les informations de date dans un champ de caractères est une si mauvaise idée.

L'option la plus simple consiste à créer une fonction qui tente de convertir la chaîne en date en utilisant les formats dans l'ordre de priorité que vous avez (c'est-à-dire 010203 2 janvier 2003 ou 3 février 2001 ou autre) et intercepte les exceptions. Quelque chose comme

CREATE OR REPLACE FUNCTION my_to_date( p_str IN VARCHAR2 )
  RETURN DATE
IS
  l_date DATE;
BEGIN
  l_date := to_date( p_str, 'YYYYMMDD' );
  RETURN l_date;
EXCEPTION
  WHEN others THEN
    BEGIN
      l_date := to_date( p_str, 'MM/DD/YYYY' );
      RETURN l_date;
    EXCEPTION 
      WHEN others
      THEN
        RETURN null;
    END;
END;

qui fonctionne quelque chose comme

SQL> CREATE OR REPLACE FUNCTION my_to_date( p_str IN VARCHAR2 )
  2    RETURN DATE
  3  IS
  4    l_date DATE;
  5  BEGIN
  6    l_date := to_date( p_str, 'YYYYMMDD' );
  7    RETURN l_date;
  8  EXCEPTION
  9    WHEN others THEN
 10      BEGIN
 11        l_date := to_date( p_str, 'MM/DD/YYYY' );
 12        RETURN l_date;
 13      EXCEPTION
 14        WHEN others
 15        THEN
 16          RETURN null;
 17      END;
 18  END;
 19  /

Function created.

SQL> select my_to_date( '19000101' ) from dual;

MY_TO_DAT
---------
01-JAN-00

SQL> ed
Wrote file afiedt.buf

  1* select my_to_date( '01/02/2005' ) from dual
SQL> /

MY_TO_DAT
---------
02-JAN-05

Bien sûr, vous devrez coder l'ensemble complet des formats de date valides dans votre code, je ne gère que les deux premiers de votre liste.