sql >> Database >  >> RDS >> Oracle

Hoe om te gaan met to_date-uitzonderingen in een SELECT-instructie om die rijen te negeren?

In navolging van Tony's opmerking, zou je veel beter datums in DATE-kolommen kunnen opslaan in plaats van een front-end query-tool te forceren om deze uitzonderingen te vinden en af ​​te handelen.

Als u echter vastzit aan een onjuist gegevensmodel, is de eenvoudigste optie in eerdere versies om een ​​functie te maken die de conversie uitvoert en de fout afhandelt,

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;

Uw vraag wordt dan

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

Natuurlijk wilt u hoogstwaarschijnlijk een functiegebaseerde index op de MY_TO_DATE aanroepen om deze zoekopdracht redelijk efficiënt te maken.

In 12.2 heeft Oracle extensies toegevoegd aan de to_date en cast functies om conversies die fout af te handelen

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

U kunt ook de validate_conversion . gebruiken functie als u op zoek bent naar alle rijen die wel (of niet) geldige datums zijn.

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


  1. Lijst met beschikbare datumnotaties met CONVERT() in SQL Server

  2. Agent is geblokkeerd

  3. Verken SQL Server Restore Database met opties voor herstel versus geen herstel

  4. Is ODP.NET vereist voor Oracle 11g Client?