sql >> Databáze >  >> RDS >> Oracle

Literál neodpovídá formátovacímu řetězci pro Oracle SQL to_date ve sloupci řetězce

Pořadí, podle kterého Oracle vyhodnocuje podmínky uvedené v klauzuli where, není pevně dané. To znamená, že se může rozhodnout vyhodnotit podmínku obsahující TO_DATE před ostatními kritérii, v takovém případě dotaz selže. Abyste tomu zabránili, přidejte do svého dotazu nápovědu order_preddicates, ale mějte na paměti, že to může vyžadovat další ruční ladění ke zlepšení výkonu.

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

Zřejmě ordered_predicates je zastaralá počínaje 10 g. V takovém případě si myslím, že vaší jedinou možností je použít poddotaz takovým způsobem, že je optimalizátor nucen nejprve vyhodnotit (tj. nemůže dotazy kombinovat). Nejjednodušší způsob, jak to udělat, je zadat rownum v příkazu where vnitřního dotazu.

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


  1. MySQL seskupuje podle data a převádí z unixového časového razítka

  2. Proveďte příkaz Vložit a vraťte vložené ID v SQL

  3. Mysql limit s příkazem in

  4. Chyba PHP:Volání členské funkce rowCount() na jiném než objektu