这是我的问题:
SELECT
COUNT(1)
FROM (
SELECT
TO_NUMBER( EXTRACT(YEAR FROM DATE'2017-01-01') - EXTRACT(YEAR FROM
TO_DATE(BIRTH_DAY, 'YYYYMMDD')) ) AS AGE,
XX.*
FROM MEMBER_INFO XX
WHERE BIRTH_DAY IS NOT NULL
) XXX
执行没有错误。但是,如果我将其添加到查询的末尾:
WHERE XXX.AGE >= 30 AND XXX.AGE < 50
我收到以下错误:
- 00000 - “日期格式的输入值不够长”(ORA-01840)
醇>
为什么会出现此错误?
答案 0 :(得分:1)
如果AGE
没有条件,则无需执行计算TO_DATE(BIRTH_DAY, 'YYYYMMDD')
来生成输出。优化程序删除所有不必要的操作,因此查询优化为:
SELECT COUNT(*)
FROM MEMBER_INFO
WHERE BIRTH_DAY IS NOT NULL
这与许多编译器的工作方式类似 - 当确定这样做不会改变执行结果时,它们会删除代码块。
但是,在条件到位的情况下,必须进行计算,不幸的是,您有BIRTH_DAY
的值无法解析为YYYYMMDD
日期,因为它太短 - 因此错误
您可以通过将内部条件更改为:
来避免此错误WHERE LENGTH(BIRTH_DAY) = 8
仍然会排除NULL
值。