0

In ORACLE I am trying to get values from PS_EMP_REVIEW_GOAL with a REVIEW_DT between 01-01-YYYY and 12-31-YYYY from last year.

I get the following error msg:

ORA-01843: not a valid month
01843. 00000 -  "not a valid month"

*Cause:

*Action:

SELECT
ERG.REVIEW_DT,
ERG.CAREER_GOAL
from PS_EMP_REVIEW_GOAL  ERG, PS_PERSONNEL P
where ERG.EMPLID = P.EMPLID
and ERG.REVIEW_DT = (Select max(ERG1.REVIEW_DT) from PS_EMP_REVIEW_GOAL  ERG1
where ERG1.EMPLID = ERG.EMPLID
and ERG1.REVIEW_DT BETWEEN to_date('01-01-' || trunc(sysdate, 'YYYY'))-1
                       AND to_date('12-31-' || trunc(sysdate, 'YYYY'))-1 
);
4

3 回答 3

2

问题是TRUNC(SYSDATE, 'YYYY')它将返回整个日期,然后您尝试将其与日和月连接:

SELECT TRUNC(SYSDATE, 'YYYY') FROM dual;
TRUNC(SYSDATE,'YYYY')
---------------------
01-01-2013  

你应该做的是EXTRACT年份,SYSDATE并使用日期格式模型将字符串转换为DATE

SELECT TO_DATE('01-01-' || EXTRACT(YEAR FROM SYSDATE), 'MM-DD-YYYY') - 1 AS val
FROM dual;
价值      
----------
31-12-2012

所以你的代码应该是这样的:

SELECT
ERG.REVIEW_DT,
ERG.CAREER_GOAL
from PS_EMP_REVIEW_GOAL  ERG, PS_PERSONNEL P
where ERG.EMPLID = P.EMPLID
and ERG.REVIEW_DT = (Select max(ERG1.REVIEW_DT) from PS_EMP_REVIEW_GOAL  ERG1
where ERG1.EMPLID = ERG.EMPLID
and ERG1.REVIEW_DT BETWEEN TO_DATE('01-01-' || EXTRACT(YEAR FROM SYSDATE), 'MM-DD-YYYY') - 1
                       AND TO_DATE('12-31-' || EXTRACT(YEAR FROM SYSDATE), 'MM-DD-YYYY') - 1
);

编辑如果要将日期与上一年的日期进行比较,则应像这样移动- 1内部TO_DATE

and ERG1.REVIEW_DT BETWEEN TO_DATE('01-01-' || (EXTRACT(YEAR FROM SYSDATE) - 1), 'MM-DD-YYYY')
                       AND TO_DATE('12-31-' || (EXTRACT(YEAR FROM SYSDATE) - 1), 'MM-DD-YYYY')
于 2013-11-12T15:56:19.277 回答
1

另一个较短的选择是:

extract(year from ERG1.REVIEW_DT) = extract(year from current_date) - 1

但是:这不会使用索引,ERG1.REVIEW_DT因此可能会因您的目的而变慢。在这种情况下,Przemyslaw 的答案要好得多,因为该表达式可以使用该列上的索引。

于 2013-11-12T15:57:44.890 回答
1

像这样的东西将实现你要求的逻辑

and ERG1.REVIEW_DT BETWEEN trunc(sysdate, 'YYYY')
                       AND add_months( trunc(sysdate, 'YYYY'), 12 ) - 1

但是,鉴于 OracleDATE始终具有日期和时间组件,这将排除review_dt12/31 但午夜之后的行。我的猜测是你真的想要

and ERG1.REVIEW_DT >= trunc(sysdate, 'YYYY')
AND ERG1.REVIEW_DT <  add_months( trunc(sysdate, 'YYYY'), 12 )
于 2013-11-12T15:58:16.533 回答