sql >> Base de Datos >  >> RDS >> Oracle

Literal no coincide con la cadena de formato para Oracle SQL to_date en una columna de cadena

El orden en que Oracle evalúa las condiciones que se encuentran en la cláusula where no es fijo. Es decir, puede optar por evaluar la condición que contiene TO_DATE antes que los demás criterios, en cuyo caso la consulta fallará. Para evitar eso, agregue la sugerencia ordered_predicates a su consulta, pero tenga en cuenta que esto puede requerir un ajuste manual adicional para mejorar el rendimiento.

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á en desuso a partir de 10 g. En ese caso, creo que su única opción es usar una subconsulta de tal manera que el optimizador se vea obligado a evaluarla primero (es decir, no puede combinar las consultas). La forma más fácil de hacer esto es poner rownum en la instrucción where de la 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