Som genlyd af Tonys kommentar ville du være langt bedre stillet med at gemme datoer i DATE-kolonner i stedet for at tvinge et frontend-forespørgselsværktøj til at finde og håndtere disse undtagelser.
Hvis du sidder fast med en forkert datamodel, er den enkleste mulighed i tidligere versioner dog at oprette en funktion, der udfører konverteringen og håndterer fejlen,
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;
Din forespørgsel bliver så
SELECT *
FROM myTable
WHERE my_to_date(myTable.sdate, 'MM/dd/yyyy') <= {?EndDate}
Selvfølgelig vil du højst sandsynligt have et funktionsbaseret indeks på MY_TO_DATE
opkald for at gøre denne forespørgsel rimelig effektiv.
I 12.2 har Oracle tilføjet udvidelser til to_date
og cast
funktioner til at håndtere konverteringer, der fejler
SELECT *
FROM myTable
WHERE to_date(myTable.sdate default null on conversion error, 'MM/dd/yyyy') <= {?EndDate}
Du kan også bruge validate_conversion
funktion, hvis du leder efter alle de rækker, der er (eller ikke er) gyldige datoer.
SELECT *
FROM myTable
WHERE validate_conversion( myTable.sdate as date, 'MM/DD/YYYY' ) = 1