关于一个sql语句的问题,请大家帮忙看看

halupipi 2011-10-11 12:30:31
1.两张表tableA,tableB
tableA.value varchar2(120) 这个值有普通值也有日期类型的值

问题出现在to_date(tableA.value, 'yyyy-mm-dd')上

sql大概为:

select t.attr_code,t.value from
(select b.attr_code, a.value from tableA a, tableB b
where b.attr_id = a.attr_id
and b.attr_code in ('xxxx', 'yyyy')
and a.prod_id = 123
order by a.create_time ) t
where to_date(t.value, ''yyyy-mm-dd') between to_date('2011-09-27', ''yyyy-mm-dd') and to_date('2012-09-27', ''yyyy-mm-dd')

内层select单独测试 可以正常查询出结果 都是日期格式的varchar2类型
但是联合测试 报错
ORA-01841: (full) year must be between -4713 and +9999

如果用select a.value from tableA a where a.prod_id = 123

结果中有非日期类型的数据,

但是已经通过 两表关联屏蔽了那些非日期类型数据,按道理应该没有问题了,
不知道神马问题?各位大大帮忙看看。

补充,我把那条被屏蔽非日期格式数据删除 ,上面的sql执行成功。百思不得其解
...全文
110 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
mailking 2011-10-11
  • 打赏
  • 举报
回复
select b.attr_code, a.value from tableA a, tableB b
where b.attr_id = a.attr_id
and b.attr_code in ('xxxx', 'yyyy')
and a.prod_id = 123
order by a.create_time

你内层的SQL那里有过滤的语句?表tableA 的过滤条件只有prod_id = 123啊
和你下面的查询过滤条件是一样的啊
select a.value from tableA a where a.prod_id = 123
你犯晕了吧
halupipi 2011-10-11
  • 打赏
  • 举报
回复
谢谢大家帮忙定位 对我帮助很大
xiaobn_cn 2011-10-11
  • 打赏
  • 举报
回复
应当是楼主你的内层过滤后的数据存在不符合日期规范的内容,比如说‘-2011-09-10’,或者是‘l998-09-10’之类的数据。
opps_zhou 2011-10-11
  • 打赏
  • 举报
回复
写一个函数,判断一下字符串是否符合日期类型
然后在 where 条件里加一个过滤
coolkisses 2011-10-11
  • 打赏
  • 举报
回复
以数据来说话,里面那层的结果,肯定有非法(非日期类型)的数据。
mailking 2011-10-11
  • 打赏
  • 举报
回复
select t.attr_code,t.value from
(select b.attr_code, a.value from tableA a, tableB b
where b.attr_id = a.attr_id
and b.attr_code in ('xxxx', 'yyyy')
and a.prod_id = 123
order by a.create_time ) t
where to_date(t.value, ''yyyy-mm-dd') between to_date('2011-09-27', ''yyyy-mm-dd') and to_date('2012-09-27', ''yyyy-mm-dd')

还有你有没看你这语句的执行计划,
oracle 有可能把你的外层的where 语句给放到内层去执行了

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧