Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie behandelt man to_date-Ausnahmen in einer SELECT-Anweisung, um diese Zeilen zu ignorieren?

In Anlehnung an Tonys Kommentar wäre es viel besser, Datumsangaben in DATE-Spalten zu speichern, als ein Front-End-Abfragetool zu zwingen, diese Ausnahmen zu finden und zu behandeln.

Wenn Sie jedoch mit einem falschen Datenmodell stecken bleiben, besteht die einfachste Option in früheren Versionen darin, eine Funktion zu erstellen, die die Konvertierung durchführt und den Fehler behandelt,

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;

Ihre Abfrage würde dann zu

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

Natürlich möchten Sie höchstwahrscheinlich einen funktionsbasierten Index für MY_TO_DATE aufrufen, um diese Abfrage einigermaßen effizient zu machen.

In 12.2 hat Oracle Erweiterungen zu to_date hinzugefügt und cast Funktionen zum Umgang mit fehlerhaften Konvertierungen

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

Sie könnten auch den validate_conversion verwenden Funktion, wenn Sie nach allen Zeilen suchen, die gültige Daten sind (oder nicht).

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