加入收藏 | 设为首页 | 会员中心 | 我要投稿 衡阳站长网 (https://www.0734zz.cn/)- 数据集成、设备管理、备份、数据加密、智能搜索!
当前位置: 首页 > 站长百科 > 正文

Literal与字符串列上的Oracle SQL to_date的格式字符串不匹配

发布时间:2021-04-01 13:55:59 所属栏目:站长百科 来源:网络整理
导读:亲爱的来自Stack Overflow的SQL专家: 环境:Oracle 我试图理解为什么我不能对包含字符串的表列进行to_date选择.注意下面示例中带有名称值Value的tableZ包含一串字符串,其中一些是正确的格式,例如6/20/2010 00:00:00. tableZ | Value || __________________

亲爱的来自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

(编辑:衡阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读