Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak obsłużyć wyjątki to_date w instrukcji SELECT, aby zignorować te wiersze?

Nawiązując do komentarza Tony'ego, o wiele lepiej byłoby przechowywać daty w kolumnach DATE, zamiast zmuszać frontonowe narzędzie do wysyłania zapytań do wyszukiwania i obsługi tych wyjątków.

Jeśli jednak utkniesz z niepoprawnym modelem danych, najprostszą opcją we wcześniejszych wersjach jest utworzenie funkcji, która wykonuje konwersję i obsługuje błąd,

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;

Twoje zapytanie zmieniłoby się wtedy w

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

Oczywiście najprawdopodobniej potrzebujesz indeksu opartego na funkcjach w dniu MY_TO_DATE wywołaj, aby zapytanie to było w miarę wydajne.

W 12.2 Oracle dodał rozszerzenia do to_date i cast funkcje do obsługi konwersji z tym błędem

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

Możesz także użyć validate_conversion funkcja, jeśli szukasz wszystkich wierszy, które są (lub nie są) prawidłowymi datami.

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Podziel ciąg na wiersze Oracle SQL

  2. Konwertuj ciąg znaków oddzielonych przecinkami na tablicę w PL/SQL

  3. Usunąć wszystkie rekordy oprócz ostatniego?

  4. Jak połączyć się z Oracle przy użyciu nazwy usługi zamiast SID

  5. Jak używać parametrów w klauzuli „where value in...”?