ADDDUR (期間の加算)
コード | 演算項目 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 に 調整します。
- '98/05/30' ADDDUR 1:*MONTHS は '98/06/30' になる。
結果の月の部分が 1 だけ大きくなって、日の部分は変わりません。
- '98/05/31' ADDDUR 1:*MONTHS は '98/06/30' になる。
結果の月の部分が 1 大きくなって (6 月は 30 日しかないので) 結果の 日の部分が調整されています。
年の期間を加算する場合にも同様の結果になります。 例えば、'92/02/29' に 1 年を加えると (結果の年は閏年ではないので) 調 整された値の '93/02/28' になります。
月の期間と年の期間の加算について詳しくは、予期しない結果を参照してください。
- 演算項目 1 の日付、時刻、またはタイム・スタンプ・フィールドの値が正しく ない
- 演算項目 1 がブランクで、 演算の前の結果フィールドの値が正しくない
- オーバーフローまたはアンダーフローが起こった (すなわち、結果 の値が *HIVAL より大きいか、または *LOVAL より小さい)
- エラー (状況コード 112 または 113) が出されます。
- エラー標識 (73-74 桁目) が指定されている場合には、この標識がオンに 設定され、'E' 拡張が指定されている場合には、%ERROR 組み込み関数が '1' を 戻すように設定されます。
- 結果フィールドの値は変わりません。
プログラム状況コードが 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