Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment gérer les exceptions to_date dans une instruction SELECT pour ignorer ces lignes ?

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