Ini adalah salah satu alasan mengapa menyimpan informasi tanggal di bidang karakter adalah ide yang buruk.
Opsi termudah adalah membuat fungsi yang mencoba mengonversi string menjadi tanggal menggunakan format dalam urutan prioritas apa pun yang Anda miliki (yaitu 010203 2 Jan 2003 atau 3 Feb 2001 atau yang lainnya) dan menangkap pengecualian. Sesuatu seperti
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;
yang berfungsi seperti
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
Tentu saja, Anda harus mengkodekan set lengkap format tanggal yang valid dalam kode Anda, saya hanya menangani dua yang pertama dalam daftar Anda.