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

Literal não corresponde à string de formato para Oracle SQL to_date em uma coluna de string


A ordem em que o Oracle avalia as condições encontradas na cláusula where não é fixa. Ou seja, ele pode optar por avaliar a condição que contém TO_DATE antes dos outros critérios, caso em que a consulta falhará. Para evitar isso, adicione a dica de predicados_ordenados à sua consulta, mas esteja ciente de que isso pode exigir ajuste manual adicional para melhorar o desempenho.
SELECT /*+ ordered_predicates */
               To_Date(c.Value, 'MM/DD/YYYY HH24:MI:SS') somedate 
          FROM properties$aud a, 
               template_properties$aud b, 
               consumable_properties$aud c 
         WHERE Lower(a.name) = 'somedate' 
           AND a.id = b.property_id 
           AND b.id = c.template_property_id 
           AND To_Date(c.Value, 'MM/DD/YYYY HH24:MI:SS') IS NOT NULL

Aparentemente ordered_predicates está obsoleto a partir de 10g. Nesse caso, acho que sua única opção é usar uma subconsulta de forma que o otimizador seja forçado a avaliá-la primeiro (ou seja, não pode combinar as consultas). A maneira mais fácil de fazer isso é colocar rownum na instrução where da consulta interna.
SELECT To_Date(c.Value, 'MM/DD/YYYY HH24:MI:SS') somedate 
  FROM (SELECT value 
          FROM properties$aud a, 
               template_properties$aud b, 
               consumable_properties$aud c 
         WHERE Lower(a.name) = 'somedate' 
           AND a.id = b.property_id 
           AND b.id = c.template_property_id
           AND rownum > 0) 
 WHERE To_Date(c.Value, 'MM/DD/YYYY HH24:MI:SS') IS NOT NULL