sql >> Databáze >  >> RDS >> Oracle

Jak zacházet s výjimkami to_date ve výpisu SELECT, aby se tyto řádky ignorovaly?

Podle Tonyho komentáře by bylo mnohem lepší ukládat data do sloupců DATE, než nutit front-end dotazovací nástroj, aby tyto výjimky našel a zpracoval.

Pokud však narazíte na nesprávný datový model, nejjednodušší možností v dřívějších verzích je vytvořit funkci, která provede převod a zpracuje chybu,

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;

Váš dotaz by pak byl

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

Samozřejmě byste s největší pravděpodobností chtěli index založený na funkcích k MY_TO_DATE zavolejte, aby byl tento dotaz přiměřeně efektivní.

Ve verzi 12.2 přidal Oracle rozšíření do to_date a cast funkce pro zpracování převodů, které chybují

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

Můžete také použít validate_conversion Pokud hledáte všechny řádky, které jsou (nebo nejsou) platnými daty.

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


  1. Proces upgradu krok za krokem na R12.2 Upgrade část -2 (hlavní upgrade ovladače pro R12.2.0)

  2. SQL AS:Použití, příklady a jak vám může nejlépe prospět

  3. Seskupení podle klauzule v mySQL a postgreSQL, proč chyba v postgreSQL?

  4. MySQL WHERE IN ()