In navolging van Tony's opmerking, zou je veel beter datums in DATE-kolommen kunnen opslaan in plaats van een front-end query-tool te forceren om deze uitzonderingen te vinden en af te handelen.
Als u echter vastzit aan een onjuist gegevensmodel, is de eenvoudigste optie in eerdere versies om een functie te maken die de conversie uitvoert en de fout afhandelt,
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;
Uw vraag wordt dan
SELECT *
FROM myTable
WHERE my_to_date(myTable.sdate, 'MM/dd/yyyy') <= {?EndDate}
Natuurlijk wilt u hoogstwaarschijnlijk een functiegebaseerde index op de MY_TO_DATE
aanroepen om deze zoekopdracht redelijk efficiënt te maken.
In 12.2 heeft Oracle extensies toegevoegd aan de to_date
en cast
functies om conversies die fout af te handelen
SELECT *
FROM myTable
WHERE to_date(myTable.sdate default null on conversion error, 'MM/dd/yyyy') <= {?EndDate}
U kunt ook de validate_conversion
. gebruiken functie als u op zoek bent naar alle rijen die wel (of niet) geldige datums zijn.
SELECT *
FROM myTable
WHERE validate_conversion( myTable.sdate as date, 'MM/DD/YYYY' ) = 1