与 Tony 的评论相呼应,您最好将日期存储在 DATE 列中,而不是强制前端查询工具查找和处理这些异常。
但是,如果您遇到不正确的数据模型,早期版本中最简单的选择是创建一个执行转换并处理错误的函数,
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;
然后你的查询将变成
SELECT *
FROM myTable
WHERE my_to_date(myTable.sdate, 'MM/dd/yyyy') <= {?EndDate}
当然,您很可能想要一个基于函数的索引MY_TO_DATE
调用以使该查询相当有效。
在 12.2 中,Oracle 添加了扩展to_date
and cast
处理错误转换的函数
SELECT *
FROM myTable
WHERE to_date(myTable.sdate default null on conversion error, 'MM/dd/yyyy') <= {?EndDate}
您还可以使用validate_conversion
如果您正在查找所有有效(或无效)日期的行,请使用此函数。
SELECT *
FROM myTable
WHERE validate_conversion( myTable.sdate as date, 'MM/DD/YYYY' ) = 1