Dit is een van de redenen waarom het zo'n slecht idee is om datumgegevens in een tekenveld op te slaan.
De gemakkelijkste optie is om een functie te maken die probeert de string naar een datum te converteren met behulp van de formaten in welke prioriteitsvolgorde je ook hebt (d.w.z. 010203 2 januari 2003 of 3 februari 2001 of iets anders) en de uitzonderingen opvangt. Iets als
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;
wat ongeveer werkt als
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
Natuurlijk moet je de volledige set geldige datumnotaties in je code coderen, ik behandel alleen de eerste twee in je lijst.