Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como lidar com exceções to_date em uma instrução SELECT para ignorar essas linhas?


Ecoando o comentário de Tony, seria muito melhor armazenar datas em colunas DATE em vez de forçar uma ferramenta de consulta de front-end a encontrar e manipular essas exceções.

No entanto, se você estiver preso a um modelo de dados incorreto, a opção mais simples nas versões anteriores é criar uma função que faça a conversão e lide com o erro,
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;

Sua consulta então se tornaria
SELECT * 
  FROM myTable
 WHERE my_to_date(myTable.sdate, 'MM/dd/yyyy') <= {?EndDate}

Obviamente, você provavelmente desejaria um índice baseado em função no MY_TO_DATE call para tornar essa consulta razoavelmente eficiente.

Na versão 12.2, a Oracle adicionou extensões ao to_date e cast funções para lidar com conversões que erro
SELECT * 
  FROM myTable
 WHERE to_date(myTable.sdate default null on conversion error, 'MM/dd/yyyy') <= {?EndDate}

Você também pode usar o validate_conversion função se você estiver procurando por todas as linhas que são (ou não) datas válidas.
SELECT *
  FROM myTable 
 WHERE validate_conversion( myTable.sdate as date, 'MM/DD/YYYY' ) = 1