亲爱的来自Stack Overflow的sql专家:
环境:Oracle
我试图理解为什么我不能对包含字符串的表列进行to_date选择.注意下面示例中带有名称值Value的tableZ包含一串字符串,其中一些是正确的格式,例如6/20/2010 00:00:00.
tableZ
| Value | | __________________ | | 6/21/2010 00:00:00 | | Somestring | | Some Other strings | | 6/21/2010 00:00:00 | | 6/22/2010 00:00:00 |
以下作品
SELECT To_Date(c.Value,'MM/DD/YYYY HH24:MI:SS') somedate FROM tableX a,tableY b,tableZ c WHERE Lower(a.name) = 'somedate' AND a.id = b.other_id AND b.id = c.new_id
这会返回类似的内容(这很好):
| somedate | | __________________ | | 21.06.2010 00:00:00 | | 21.06.2010 00:00:00 | | 22.06.2010 00:00:00 |
以下不起作用
SELECT 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
回来:
ORA-01861:文字与格式字符串不匹配
我在这里错过了什么?快速说明:
... AND b.id = c.template_property_id AND To_Date(c.Value,'DD.MM.YYYY HH24:MI:SS') IS NOT NULL
也不起作用.
谢谢!!
目标是能够在c.value上对BETWEEN查询日期以选择日期范围.
解决方法
Oracle评估where子句中找到的条件的顺序不固定.也就是说,它可以选择在其他条件之前评估包含TO_DATE的条件,在这种情况下查询将失败.为了防止这种情况,请将ordered_predicates提示添加到查询中,但请注意,这可能需要额外的手动调整以提高性能.
SELECT /*+ ordered_predicates */ To_Date(c.Value,'MM/DD/YYYY HH24:MI:SS') IS NOT NULL
显然,ordered_predicates从10g开始不推荐使用.在这种情况下,我认为您唯一的选择是使用子查询,以便优化器首先被强制评估它(即它不能组合查询).最简单的方法是将rownum放在内部查询的where语句中.
SELECT To_Date(c.Value,'MM/DD/YYYY HH24:MI:SS') somedate FROM (SELECT value FROM properties$aud a,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