sql >> Databasteknik >  >> RDS >> Oracle

Hur hanterar man to_date-undantag i en SELECT-sats för att ignorera dessa rader?

Om du återspeglar Tonys kommentar är det mycket bättre att du lagrar datum i DATE-kolumner istället för att tvinga ett front-end frågeverktyg att hitta och hantera dessa undantag.

Om du har fastnat med en felaktig datamodell är det enklaste alternativet i tidigare versioner att skapa en funktion som gör konverteringen och hanterar felet,

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 fråga blir då

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

Naturligtvis vill du sannolikt ha ett funktionsbaserat index på MY_TO_DATE ring för att göra denna fråga någorlunda effektiv.

I 12.2 har Oracle lagt till tillägg till to_date och cast funktioner för att hantera konverteringar som felet

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

Du kan också använda validate_conversion funktion om du letar efter alla rader som är (eller inte är) giltiga datum.

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


  1. SQL Server BCP export skadad fil?

  2. Topp fem överväganden för databasindexdesign i SQL Server

  3. Returnera rad med maxvärdet för en kolumn per grupp

  4. Felsökning av SQL Server CPU-prestandaproblem