Nhắc lại nhận xét của Tony, tốt hơn hết bạn nên lưu trữ ngày tháng trong các cột DATE hơn là buộc công cụ truy vấn giao diện người dùng phải tìm và xử lý những trường hợp ngoại lệ này.
Tuy nhiên, nếu bạn gặp khó khăn với mô hình dữ liệu không chính xác, tùy chọn đơn giản nhất trong các phiên bản trước đó là tạo một hàm thực hiện chuyển đổi và xử lý lỗi,
CREATE OR REPLACE FUNCTION my_to_date( p_date_str IN VARCHAR2,
p_format_mask IN VARCHAR2 )
RETURN DATE
IS
l_date DATE;
BEGIN
l_date := to_date( p_date_str, p_format_mask );
RETURN l_date;
EXCEPTION
WHEN others THEN
RETURN null;
END my_to_date;
Truy vấn của bạn sau đó sẽ trở thành
SELECT *
FROM myTable
WHERE my_to_date(myTable.sdate, 'MM/dd/yyyy') <= {?EndDate}
Tất nhiên, bạn rất có thể muốn có một chỉ mục dựa trên hàm vào MY_TO_DATE
gọi để làm cho truy vấn này hiệu quả một cách hợp lý.
Trong 12.2, Oracle đã thêm các phần mở rộng vào to_date
và cast
các chức năng để xử lý các chuyển đổi bị lỗi
SELECT *
FROM myTable
WHERE to_date(myTable.sdate default null on conversion error, 'MM/dd/yyyy') <= {?EndDate}
Bạn cũng có thể sử dụng validate_conversion
hoạt động nếu bạn đang tìm kiếm tất cả các hàng có (hoặc không phải) ngày hợp lệ.
SELECT *
FROM myTable
WHERE validate_conversion( myTable.sdate as date, 'MM/DD/YYYY' ) = 1