Oracle
 sql >> Database >  >> RDS >> Oracle

Come gestire le eccezioni to_date in un'istruzione SELECT per ignorare quelle righe?

Facendo eco al commento di Tony, faresti molto meglio a memorizzare le date nelle colonne DATE piuttosto che forzare uno strumento di query front-end a trovare e gestire queste eccezioni.

Se sei bloccato con un modello di dati errato, tuttavia, l'opzione più semplice nelle versioni precedenti è creare una funzione che esegua la conversione e gestisca l'errore,

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;

La tua richiesta diventerebbe quindi

SELECT * 
  FROM myTable
 WHERE my_to_date(myTable.sdate, 'MM/dd/yyyy') <= {?EndDate}

Ovviamente, molto probabilmente vorresti un indice basato su funzioni su MY_TO_DATE chiamare per rendere questa query ragionevolmente efficiente.

Nella versione 12.2, Oracle ha aggiunto estensioni a to_date e cast funzioni per gestire le conversioni che generano errori

SELECT * 
  FROM myTable
 WHERE to_date(myTable.sdate default null on conversion error, 'MM/dd/yyyy') <= {?EndDate}

Puoi anche usare il validate_conversion funzione se stai cercando tutte le righe che sono (o non sono) date valide.

SELECT *
  FROM myTable 
 WHERE validate_conversion( myTable.sdate as date, 'MM/DD/YYYY' ) = 1