oracle中对查询结果的to_date转换是在where子句执行后执行的还是在执行前执行的 5

我在执行查询语句时发现当我用selectto_date(month,'YYYYMM')fromtable1whereflag='0'时查询日期时,oracle报month... 我在执行查询语句时发现当我用select to_date(month,'YYYYMM') from table1 where flag = '0' 时查询日期时,oracle报month的长度不符合转换格式,原因是在table1中有一条month的值是0。除此之外month的值都是6位的num型,通过flag = '0'可以过滤掉这条记录,但是oracle还是报了错;可是当我执行select months_between(to_date(201410,'YYYYMM'),to_date(month,'YYYYMM')) from table1 where flag = '0' 时语句执行成功了,也就是说flag = '0'的条件成功过滤掉了month=0的记录,并将过滤后生成的虚拟表作为select语句的入参,但是在前一种情况下to_date似乎是对全表起的作用,而并非是对flag = '0'之后的结果操作的,这难道是因为to_date是在where子句之前执行的吗,那为什么后一种情况的to_date没有先执行呢?
不知那位oracle大手能为在下指点迷津,十分感谢
对于to_date函数对num型数据的隐士转换问题本人是知道的,但这不是导致问题出现的原因,所以请大家不必再提醒我这一点了,这个问题的出现重点在于oracle在执行查询时对于单纯的to_date没有执行where子句的过滤,而对于month_between函数where子句却执行成功了,这一点很令人困惑,不知哪位高手可以指点一二,不胜感激!
展开
 我来答
yang_wling23c
2014-10-31 · TA获得超过547个赞
知道小有建树答主
回答量:200
采纳率:73%
帮助的人:63.2万
展开全部
其实你想多了
select to_date(month,'YYYYMM') ,你的这句话是有问题的。

首先你去查下to_date函数的第一个参数应该是字符串类型,而这里你是number类型,当然会报错。应该是select to_date(to_char(month),'YYYYMM')

其次,select months_between(to_date(201410,'YYYYMM'),to_date(month,'YYYYMM')) 成功是因为有to_date了。

最后,“这难道是因为to_date是在where子句之前执行的吗”这句话也有问题,一般来讲select子句永远是最后执行,而where一般都是较早执行,这是普遍情况。具体你要看执行计划。
追问
大哥to_date可以通过隐士转换将num型的数据转换成char型,然后再格式转换成date型数据的,如果你真正用过oracal就会知道这不会报错,这根本不是原因。还有正是因为select子句是最后执行的所以我才对出现这种情况表示困惑,希望大家能帮我解答。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式