比较两个日期的提取年份

时间:2014-11-20 08:32:09

标签: sql oracle date oracle11g

我想比较两个日期的年份。 提取它们不是问题所在,但是,我似乎无法进行比较工作,我觉得很奇怪,因为我知道几个月前我做了完全相同的事情而没有任何问题。我希望有人可以解释发生错误的原因。

关于我的专栏的一些信息:

  • keydate列是NUMBER(11,0);列中的原始数据样本:20140531
  • fieldvalue列是VARCHAR2(100 CHAR);列中的原始数据样本: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;

2 个答案:

答案 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;