我想比较两个日期的年份。 提取它们不是问题所在,但是,我似乎无法进行比较工作,我觉得很奇怪,因为我知道几个月前我做了完全相同的事情而没有任何问题。我希望有人可以解释发生错误的原因。
关于我的专栏的一些信息:
20140531
19.07.2017
我的查询引发ORA-01722 invalid number
例外:
SELECT identifier, EXTRACT(YEAR FROM TO_DATE(a.keydate, 'yyyymmdd')) AS keydate,
EXTRACT(YEAR FROM TO_DATE(a.fieldvalue, 'dd.mm.yyyy')) As fieldvalue
FROM My_Table a
WHERE a.fieldindex = 15 AND a.fieldvalue IS NOT NULL AND identifier <> -1
AND TO_NUMBER(fieldvalue) >= keydate
Order by identifier;
由于2014
语句,我希望查询将2017
和ÈXTRACT(...)
存储在keydate / fieldvalue中。这些数字很好,所以我不明白为什么抛出这个异常,因为我明确地将fieldvalue转换为数字......你能否给我一些关于这里出了什么问题的提示?
编辑:可能找到错误的原因...我倾向于忘记你不能使用你在where子句中选择的变量:/现在错误是有道理的,我会尝试通过围绕它构建另一个查询来修复它。感谢您的帮助。
Edit2:我将原始查询用作子查询,希望能解决问题。但是,我现在收到一条新的错误消息ORA-01830 date format picture ends before converting entire input string
,考虑到我不在父查询中执行任何日期转换操作,并且子查询本身可以正常工作,我发现更奇怪。我还尝试了其他变体,即在父查询where子句中显式地将fieldvalue和keydate转换为NUMBER,CHAR,DATE,但是,错误消息仍然存在:
SELECT identifier, keydate, fieldvalue
FROM
(
SELECT identifier, EXTRACT(YEAR FROM TO_DATE(a.keydate, 'yyyymmdd')) AS keydate,
EXTRACT(YEAR FROM TO_DATE(a.fieldvalue, 'dd.mm.yyyy')) As fieldvalue
FROM My_Table a
WHERE a.fieldindex = 15 AND a.fieldvalue IS NOT NULL AND identifier <> -1
)
WHERE fieldvalue >= keydate
ORDER BY identifier;
答案 0 :(得分:2)
替换
AND TO_NUMBER(fieldvalue) >= keydate
带
AND case when identifier <> -1
then EXTRACT(YEAR FROM TO_DATE(a.fieldvalue, 'dd.mm.yyyy'))
else null end
>= EXTRACT(YEAR FROM TO_DATE(a.keydate, 'yyyymmdd'))
SELECT列表中的表达式是在所有其他子句(如FROM,WHERE,GROUP BY,HAVING)之后计算的(除最后计算的ORDER BY之外)
因此,当Oracle在WHERE中计算条件时,它对SELECT列表中的表达式一无所知。并且它没有在WHERE子句
中看到SELECT的列别名答案 1 :(得分:0)
select extract(year from to_date(keydate,'RRRRMMDD')) keydate,
extract(year from to_date(regexp_substr(fieldvalue,'[^.]+', 1,3)||regexp_substr(fieldvalue,'[^.]+', 1,2)||regexp_substr(fieldvalue,'[^.]+', 1,1),'RRRRMMDD')) fieldvalue
from t123;