自由形式構文 | (許可されていない - %YEARS および %MONTHS などの 期間関数では + または += 演算子を使用) |
コード | 演算項目 1 | 演算項目 2 | 結果フィールド | 標識 | ||
---|---|---|---|---|---|---|
ADDDUR (E) | 日付/時刻 | 期間: 期間コード | 日付/時刻 | _ | ER | _ |
ADDDUR 命令は演算項目 2 に指定された期間を日付または時刻に加算し、結 果の日付、時刻、またはタイム・スタンプを結果フィールドに入れます。
演算項目 1 は任意指定で、日付、時刻、またはタイム・スタンプ・フィールド、 サブフィールド、配列、配列要素、リテラル、または定数を入れることが できます。 演算項目 1 にフィールド名、配列、または配列要素が入っている場合には、 そのデータ・タイプは結果フィールドに指定されたフィールドと同じデータ ・タイプでなければなりません。 演算項目 1 が指定されていない場合には、期間は結果フィールドに指定され たフィールドに加えられます。
演算項目 2 は必須で、2 つの副演算項目が入ります。 1 番目は期間で、数値フィールド、配列要素、または小数点以下の桁数がゼロ の定数になります。期間が負の場合には、その値が日付から引かれます。 2 番目の副演算項目は、期間のタイプを示す有効な期間コードでなければなりません。 期間コードは、結果フィールドのデータ・タイプと同じでなければなりません。 年、 月、または日の期間は日付フィールド加算できますが、時間の分の期間は 加算できません。期間コードとその短縮形のリストについて は、日付命令を参照してください。
結果フィールドは、日付、時刻、またはタイム・スタンプ・データ・タイプ・フ ィールド、配列、または配列要素でなければなりません。 演算項目 1 がブランクの場合には、期間は結果フィールドの値に加えられま す。 結果フィールドが配列の場合には、演算項目 2 の値が配列のそれぞれの要素 に加算されます。 結果フィールドが時刻フィールドの場合には、結果は常に有効な時刻となりま す。 例えば、23:59:59 に 59 分を加えると 24:58:59 になります。 この時刻は有効でないので、コンパイラーはこれを 00:58:59 に 調整します。
月の期間を日付に加算する場合の一般的な規則では、月の部分が期間の月数だ け増やされて、日の部分は変わりません。 この例外は、結果の日の部分が結果の月の実際の日数を超える場合です。 この場合には、結果の日の部分が実際の月の最終日付に合わせて調整されます。次の例 (*YMD 形式と想定している) はこの点について示しています。
結果の月の部分が 1 だけ大きくなって、日の部分は変わりません。
結果の月の部分が 1 大きくなって (6 月は 30 日しかないので) 結果の 日の部分が調整されています。
年の期間を加算する場合にも同様の結果になります。 例えば、'92/02/29' に 1 年を加えると (結果の年は閏年ではないので) 調 整された値の '93/02/28' になります。
次のいずれかの場合にはエラー状態になります。
エラー状態では次のことが行われます。
プログラム状況コードが 112 または 113 である 例外を処理するために、命令コード拡張 'E' またはエラー標識 ER を指定できますが、 両方を指定することはできません。 エラー処理の詳細について は、プログラム例外/エラーを参照してください。
日付/時刻フィールドの処理の詳細については、日付命令を 参照してください。
*...1....+....2....+....3....+....4....+....5....+....6....+....7...+.... HKeywords+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ H TIMFMT(*USA) DATFMT(*MDY&) DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++ * DDateconst C CONST(D'12 31 92') * * Define a Date field and initialize * DLoandate S D DATFMT(*EUR) INZ(D'12 31 92') DDuedate S D DATFMT(*ISO) Dtimestamp S Z Danswer S T CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq.... * Determine a DUEDATE which is xx years, yy months, zz days later * than LOANDATE. C LOANDATE ADDDUR XX:*YEARS DUEDATE C ADDDUR YY:*MONTHS DUEDATE C ADDDUR ZZ:*DAYS DUEDATE * Determine the date 23 days later * C ADDDUR 23:*D DUEDATE * Add a 1234 microseconds to a timestamp * C ADDDUR 1234:*MS timestamp * Add 12 HRS and 16 minutes to midnight * C T'00:00 am' ADDDUR 12:*Hours answer C ADDDUR 16:*Minutes answer * Subtract 30 days from a loan due date * C ADDDUR -30:*D LOANDUE