在ORACLE中获取从01-01-YYYY到12-31-YYYY的值

时间:2013-11-12 15:45:19

标签: sql oracle date

在ORACLE中,我尝试从PS_EMP_REVIEW_GOAL获取{{1>}以及 01-01-YYYY 12-31-YYYY 之间的值从去年开始。

我收到以下错误消息:

REVIEW_DT

*原因:

*动作:

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

3 个答案:

答案 0 :(得分: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;
VAL      
----------
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')

答案 1 :(得分:1)

另一个较短的选择是:

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

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

答案 2 :(得分:1)

这样的事情将实现你要求的逻辑

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

鉴于Oracle DATE始终具有日期和时间组件,这将排除review_dt在12月31日但在午夜之后的行。我的猜测是你真的想要

and ERG1.REVIEW_DT >= trunc(sysdate, 'YYYY')
AND ERG1.REVIEW_DT <  add_months( trunc(sysdate, 'YYYY'), 12 )