Oracle
 sql >> Database >  >> RDS >> Oracle

Il valore letterale non corrisponde alla stringa di formato per Oracle SQL to_date su una colonna di stringa

L'ordine in cui Oracle valuta le condizioni trovate nella clausola where non è fisso. Vale a dire che può scegliere di valutare la condizione contenente TO_DATE prima degli altri criteri, nel qual caso la query avrà esito negativo. Per evitarlo, aggiungi l'hint order_predicates alla tua query, ma tieni presente che ciò potrebbe richiedere un'ulteriore messa a punto manuale per migliorare le prestazioni.

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

Apparentemente ordered_predicates è deprecato a partire da 10 g. In tal caso, penso che la tua unica opzione sia quella di utilizzare una sottoquery in modo tale che l'ottimizzatore sia costretto a valutarla prima (cioè non può combinare le query). Il modo più semplice per farlo è inserire rownum nell'istruzione where della query 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