Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle Date-Spaltenreinigung

Dies ist einer der Gründe, warum das Speichern von Datumsinformationen in einem Zeichenfeld eine so schlechte Idee ist.

Die einfachste Möglichkeit besteht darin, eine Funktion zu erstellen, die versucht, die Zeichenfolge unter Verwendung der Formate in einer beliebigen Prioritätsreihenfolge (z. B. 010203, 2. Januar 2003 oder 3. Februar 2001 oder etwas anderes) in ein Datum zu konvertieren und die Ausnahmen abzufangen. So etwas wie

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;

das funktioniert so etwas wie

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

Natürlich müssten Sie den vollständigen Satz gültiger Datumsformate in Ihrem Code codieren, ich handhabe nur die ersten beiden in Ihrer Liste.