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