1. ホーム
  2. oracle

[解決済み] ora-01841 通年は4713~9999の間で、0であってはならない。

2022-02-25 20:02:52

質問

私は、エラーメッセージを理解することができなかったようで、私を狂わせているクエリに取り組んできました:私のクエリは次のとおりです。

SELECT  MYTABLE." ID ", 


  NVL(max(TO_DATE(TO_CHAR(ADD_MONTHS(MYTABLE." XISSU_DT " ,MYTABLE." XTNR "), 'DD/MM/YYYY'),'DD/MM/YYYY')),  TO_DATE(SYSDATE , 'DD/MM/YYYY') )  MAXLASTINSDATE,

   TO_DATE(SYSDATE , 'DD/MM/YYYY'), 


      (TO_CHAR (TO_DATE(SYSDATE , 'DD/MM/YYYY')
           - TO_DATE(NVL(max(TO_DATE(TO_CHAR(ADD_MONTHS(MYTABLE." XISSU_DT " ,MYTABLE." XTNR "), 'DD/MM/YYYY'),'DD/MM/YYYY')),  TO_DATE(SYSDATE , 'DD/MM/YYYY') ) , 'DD/MM/YYYY')) * -1) MaturityPeriod


     FROM MYTABLE
where  
MYTABLE." STATUS " = 'A'
group by MYTABLE." ID "

The Error I have been getting is:

ora-01841 full year must be between 4713 and 9999 and not be 0

本当にありがとうございます。

解決方法は?

TO_DATE(TO_CHAR(datevalue, 'DD/MM/YYYY'),'DD/MM/YYYY') は、実質的に同じである任意の時間コンポーネントを削除しています。 TRUNC( datevalue ) .

次に TO_DATE(SYSDATE , 'DD/MM/YYYY') は、おそらくあなたのエラーがある場所です。 TO_DATE( stringvalue, format_model ) は第一引数に文字列を取るので、事実上このようになります。

TO_DATE(
  TO_CHAR(
    SYSDATE,
    ( SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT' )
  ),
  'DD/MM/YYYY'
)

として意味をなさない。 SYSDATE はすでに DATE というデータ型なので TO_DATE を使用します。

最後に TO_CHAR(SYSDATE - datevalue)*-1 なぜ、文字列に変換してから数値を掛けるのか。

(SYSDATE - datevalue)*-1

しかし *-1 というように、用語を入れ替えるだけでよいのです。

(datevalue - SYSDATE)

それを整理すると、次のようになります。

SELECT  MYTABLE." ID ", 
        NVL(
          MAX( TRUNC( ADD_MONTHS(MYTABLE." XISSU_DT " ,MYTABLE." XTNR ") ) ),
          SYSDATE
        ) MAXLASTINSDATE,
        SYSDATE, 
        ( NVL(
            MAX( TRUNC( ADD_MONTHS(MYTABLE." XISSU_DT " ,MYTABLE." XTNR ") ) ),
            SYSDATE
          )
          - SYSDATE
        ) AS MaturityPeriod
FROM   MYTABLE
where  MYTABLE." STATUS " = 'A'
group by MYTABLE." ID "