Đây là một trong những lý do khiến việc lưu trữ thông tin ngày tháng trong trường ký tự là một ý tưởng tồi.
Tùy chọn dễ nhất là tạo một hàm cố gắng chuyển đổi chuỗi thành ngày bằng cách sử dụng các định dạng theo bất kỳ thứ tự ưu tiên nào mà bạn có (tức là 010203 ngày 2 tháng 1 năm 2003 hoặc ngày 3 tháng 2 năm 2001 hoặc thứ gì đó khác) và bắt các trường hợp ngoại lệ. Một cái gì đó giống như
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;
cái gì đó hoạt động giống như
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
Tất nhiên, bạn phải viết mã tập hợp đầy đủ các định dạng ngày hợp lệ trong mã của mình, tôi chỉ xử lý hai định dạng đầu tiên trong danh sách của bạn.