免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2501 | 回复: 10
打印 上一主题 下一主题

搞不懂这个SQL,各位进来看看 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-25 15:40 |只看该作者 |倒序浏览
如下两条SQL语句,查询意图完全一样,唯一区别只是where条件的位置不一样,

1:
select a.* from tm_billlist a
where to_date(substr(a.fd_filename,22,8 ),'YYYY-MM-DD') = TO_DATE('20060915','YYYY-MM-DD')
and a.fd_filename like 'IP_OFDINC%.txt.Z'

2:
select a.* from tm_billlist a
where a.fd_filename like 'IP_OFDINC%.txt.Z'
and to_date(substr(a.fd_filename,22,8 ),'YYYY-MM-DD') = TO_DATE('20060915','YYYY-MM-DD')

第1条SQL没有问题,完全符合查询要求,第2条却报错,这是为什么,请各位帮看看,
报错内容:ORA-1861:literal does not maatch format string

谢谢!!!

[ 本帖最后由 zhilon 于 2006-9-25 16:10 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-09-25 15:49 |只看该作者
能把论坛的转义字符去掉吗...........

估计是转换时间时,格式不对(过长或过短)

论坛徽章:
0
3 [报告]
发表于 2006-09-25 18:17 |只看该作者
请各位回复,给个思路也行呀!

论坛徽章:
0
4 [报告]
发表于 2006-09-25 18:36 |只看该作者
这两个条件都一样啊,没看出哪里有错误阿

论坛徽章:
0
5 [报告]
发表于 2006-09-25 18:37 |只看该作者
ORA-01861 literal does not match format string

Cause: Literals in the input must be the same length as literals in the format string (with the exception of leading white space). If the "FX" modifier has been toggled on, the literal must match exactly, with no extra white space.

Action: Correct the format string to match the literal.

论坛徽章:
0
6 [报告]
发表于 2006-09-29 15:21 |只看该作者
还是没有人回复,自已顶一下

论坛徽章:
0
7 [报告]
发表于 2006-09-29 16:34 |只看该作者
日期格式错了, 看看下面查询可不可以
select a.* from tm_billlist a
where a.fd_filename like 'IP_OFDINC%.txt.Z'
and to_date(substr(a.fd_filename,22,8 ),'YYYY-MM-DD') = TO_DATE('20060915','YYYYMMDD')

论坛徽章:
0
8 [报告]
发表于 2006-09-29 16:52 |只看该作者
[quote]原帖由 [i]zhilon[/i] 于 2006-9-25 15:40 发表
如下两条SQL语句,查询意图完全一样,唯一区别只是where条件的位置不一样,

1:
select a.* from tm_billlist a
where to_date(substr(a.fd_filename,22,8 ),'YYYY-MM-DD') = TO_DATE('20060915','YYYY-MM-D ... [/quote]



我作了如下测试:

CREATE TABLE tm_billlist(fd_filename VARCHAR2(100));

INSERT INTO tm_billlist VALUES('IP_OFDING20060915.txt.Z');

COMMIT;

查询1:
   SELECT * FROM tm_billlist ta
                   WHERE ta.fd_filename LIKE 'IP_OFDING%.txt.Z'
                        AND TO_DATE(SUBSTR(ta.fd_filename,10,8),'YYYY-MM-DD')=TO_DATE('20060915','YYYY-MM-DD');

   结果:
   FD_FILENAME
   ----------------------
   IP_OFDING20060915.txt.Z

查询2:
   SELECT * FROM tm_billlist ta
                   WHERE TO_DATE(SUBSTR(ta.fd_filename,10,8),'YYYY-MM-DD')=TO_DATE('20060915','YYYY-MM-DD')
                        AND ta.fd_filename LIKE 'IP_OFDING%.txt.Z';

   结果:
   FD_FILENAME
   ----------------------
   IP_OFDING20060915.txt.Z

怀疑是你copy语句的时候字符转换问题,建议手工输入验证一下。

论坛徽章:
0
9 [报告]
发表于 2006-09-29 17:08 |只看该作者
在楼上的基础上我又做了试验
INSERT INTO tm_billlist VALUES('IP_OFDING2006915.txt.Z');
就出现了以上结果,由此可以分析
select a.* from tm_billlist a
where a.fd_filename like 'IP_OFDINC%.txt.Z'
and to_date(substr(a.fd_filename,22,8 ),'YYYY-MM-DD') = TO_DATE('20060915','YYYY-MM-DD')
oracle 根据RBO 进行查询时,先使用后面的to_date(substr(a.fd_filename,22,8 ),'YYYY-MM-DD') = TO_DATE('20060915','YYYY-MM-DD')对表中记录进行判断,而你表中有其他不符合日期格式的记录,此时oracle 会出错
而你的第一条语句已经将不符合日期格式的记录过滤了后再执行日期格式判断的所以不会错

论坛徽章:
0
10 [报告]
发表于 2006-09-29 17:59 |只看该作者
多谢各位的回复,问题依然存存,dtsjs 说的有道理,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP