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

Hvordan håndteres to_date undtagelser i en SELECT-sætning for at ignorere disse rækker?

Som genlyd af Tonys kommentar ville du være langt bedre stillet med at gemme datoer i DATE-kolonner i stedet for at tvinge et frontend-forespørgselsværktøj til at finde og håndtere disse undtagelser.

Hvis du sidder fast med en forkert datamodel, er den enkleste mulighed i tidligere versioner dog at oprette en funktion, der udfører konverteringen og håndterer fejlen,

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;

Din forespørgsel bliver så

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

Selvfølgelig vil du højst sandsynligt have et funktionsbaseret indeks på MY_TO_DATE opkald for at gøre denne forespørgsel rimelig effektiv.

I 12.2 har Oracle tilføjet udvidelser til to_date og cast funktioner til at håndtere konverteringer, der fejler

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

Du kan også bruge validate_conversion funktion, hvis du leder efter alle de rækker, der er (eller ikke er) gyldige datoer.

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


  1. Kom godt i gang med Oracle Application Express-APEX

  2. Et tabelnavn som en variabel

  3. Hvordan får man mysqli til at kaste undtagelser ved hjælp af MYSQLI_REPORT_STRICT?

  4. Automatisk sletning af fastlåste processer i MS SQL Server