Podle Tonyho komentáře by bylo mnohem lepší ukládat data do sloupců DATE, než nutit front-end dotazovací nástroj, aby tyto výjimky našel a zpracoval.
Pokud však narazíte na nesprávný datový model, nejjednodušší možností v dřívějších verzích je vytvořit funkci, která provede převod a zpracuje chybu,
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;
Váš dotaz by pak byl
SELECT *
FROM myTable
WHERE my_to_date(myTable.sdate, 'MM/dd/yyyy') <= {?EndDate}
Samozřejmě byste s největší pravděpodobností chtěli index založený na funkcích k MY_TO_DATE
zavolejte, aby byl tento dotaz přiměřeně efektivní.
Ve verzi 12.2 přidal Oracle rozšíření do to_date
a cast
funkce pro zpracování převodů, které chybují
SELECT *
FROM myTable
WHERE to_date(myTable.sdate default null on conversion error, 'MM/dd/yyyy') <= {?EndDate}
Můžete také použít validate_conversion
Pokud hledáte všechny řádky, které jsou (nebo nejsou) platnými daty.
SELECT *
FROM myTable
WHERE validate_conversion( myTable.sdate as date, 'MM/DD/YYYY' ) = 1