Това е една от причините съхраняването на информация за дата в символно поле да е толкова лоша идея.
Най-лесният вариант е да създадете функция, която се опитва да преобразува низа в дата, като използва форматите в какъвто и приоритетен ред да имате (т.е. е 010203 2 януари 2003 г. или 3 февруари 2001 г. или нещо друго) и улавя изключенията. Нещо като
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;
който работи нещо като
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
Разбира се, ще трябва да кодирате пълния набор от валидни формати за дата в кода си, аз се занимавам само с първите два в списъка ви.