0

ORACLE では、昨年 の01-01-YYYY12-31-YYYYPS_EMP_REVIEW_GOALREVIEW_DT間の値を取得しようとしています。

次のエラー メッセージが表示されます。

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

*原因:

*アクション:

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')
----------------------
2013 年 1 月 1 日  

代わりにすべきことはEXTRACTSYSDATE日付形式モデルを使用して文字列を次のように変換することDATEです。

SELECT TO_DATE('01-01-' || EXTRACT(YEAR FROM SYSDATE), 'MM-DD-YYYY') - 1 AS val
FROM dual;
ヴァル      
----------
2012 年 12 月 31 日

したがって、コードは次のようになります。

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

BUT : これはインデックスを使用しない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 で午前 0 時以降の行は除外されます。私の推測では、あなたは本当に欲しいのです

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