Повтаряйки коментара на Тони, ще бъде много по-добре да съхранявате дати в колони 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
и 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