在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"
答案 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 )