Faisant écho au commentaire de Tony, vous feriez bien mieux de stocker les dates dans des colonnes DATE plutôt que de forcer un outil de requête frontal à trouver et gérer ces exceptions.
Si vous êtes coincé avec un modèle de données incorrect, cependant, l'option la plus simple dans les versions antérieures est de créer une fonction qui effectue la conversion et gère l'erreur,
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;
Votre requête deviendrait alors
SELECT *
FROM myTable
WHERE my_to_date(myTable.sdate, 'MM/dd/yyyy') <= {?EndDate}
Bien sûr, vous voudrez probablement un index basé sur la fonction sur le MY_TO_DATE
call afin de rendre cette requête raisonnablement efficace.
Dans 12.2, Oracle a ajouté des extensions au to_date
et cast
fonctions pour gérer les conversions erronées
SELECT *
FROM myTable
WHERE to_date(myTable.sdate default null on conversion error, 'MM/dd/yyyy') <= {?EndDate}
Vous pouvez également utiliser le validate_conversion
fonction si vous recherchez toutes les lignes qui sont (ou ne sont pas) des dates valides.
SELECT *
FROM myTable
WHERE validate_conversion( myTable.sdate as date, 'MM/DD/YYYY' ) = 1