CVTDAT を利用した日付計算の例を示す。
この例では本日から2週間後の日付を計算する例である。
サンプル・ソースでは System i の日付形式が YMD であっても、または MDY
, DMY であっても
正しく動作するように配慮されている。
【サンプル: TESTDCVT4】
---------------------------------------------------------------------------------- 0001.00 PGM 0002.00 /*---------------------------------------------------------*/ 0003.00 /* TESTDCVT4 : 日付の変換テスト 4: */ 0004.00 /* 本日から2週間後の日付を算出する */ 0005.00 /*---------------------------------------------------------*/ 0006.00 DCL VAR(&DATE6) TYPE(*CHAR) LEN(6) 0007.00 DCL VAR(&TODATE10) TYPE(*CHAR) LEN(10) 0008.00 DCL VAR(&DATFMT) TYPE(*CHAR) LEN(3) 0009.00 DCL VAR(&QDATFMT) TYPE(*CHAR) LEN(4) 0010.00 DCL VAR(&DAYSU) TYPE(*CHAR) LEN(8) 0011.00 DCL VAR(&DEC08) TYPE(*DEC) LEN(8 0) 0012.00 0013.00 RTVSYSVAL SYSVAL(QDATE) RTNVAR(&DATE6) 0014.00 RTVSYSVAL SYSVAL(QDATFMT) RTNVAR(&DATFMT) 0015.00 CHGVAR VAR(&QDATFMT) VALUE('*' *CAT &DATFMT) 0016.00 CVTDAT DATE(&DATE6) TOVAR(&DAYSU) FROMFMT(&QDATFMT) + 0017.00 TOFMT(*JUL) TOSEP(*NONE) 0018.00 CHGVAR VAR(&DEC08) VALUE(&DAYSU) 0019.00 CHGVAR VAR(&DEC08) VALUE(&DEC08 + 14) 0020.00 CHGVAR VAR(&DAYSU) VALUE(&DEC08) 0021.00 ZEROS: IF COND(%SST(&DAYSU 1 1) *EQ '0') THEN(DO) 0022.00 CHGVAR VAR(&DAYSU) VALUE(%SST(&DAYSU 2 7) *CAT ' ') 0023.00 GOTO ZEROS 0024.00 ENDDO 0025.00 CVTDAT DATE(&DAYSU) TOVAR(&TODATE10) FROMFMT(*JUL) + 0026.00 TOFMT(*YYMD) TOSEP(/) 0027.00 SNDPGMMSG MSG(' 本日 ' *CAT &DATE6 *CAT + 0028.00 ' から2週間後は ' *CAT &TODATE10 *TCAT + 0029.00 ' です。 ') MSGTYPE(*DIAG) 0030.00 ENDPGM ----------------------------------------------------------------------------------
【実行】
> CALL TESTDCVT4 本日 120529 から2週間後は 2012/06/12 です。
【解説】
System i が どのような日付形式で登録されていたとしても
0014.00 RTVSYSVAL SYSVAL(QDATFMT) RTNVAR(&DATFMT) 0015.00 CHGVAR VAR(&QDATFMT) VALUE('*' *CAT &DATFMT)
によって元の日付形式を取得してから
0016.00 CVTDAT DATE(&DATE6) TOVAR(&DAYSU) FROMFMT(&QDATFMT) + 0017.00 TOFMT(*JUL) TOSEP(*NONE)
で、元の日付形式を指定して日数に変換しているので、どのような場合でも正しく日数を
取得することができる。
次に、
0018.00 CHGVAR VAR(&DEC08) VALUE(&DAYSU) 0019.00 CHGVAR VAR(&DEC08) VALUE(&DEC08 + 14) 0020.00 CHGVAR VAR(&DAYSU) VALUE(&DEC08)
によって 日数に +14 して2週間後の日数(*JUL
)を計算している。
0021.00 ZEROS: IF COND(%SST(&DAYSU 1 1) *EQ '0') THEN(DO) 0022.00 CHGVAR VAR(&DAYSU) VALUE(%SST(&DAYSU 2 7) *CAT ' ') 0023.00 GOTO ZEROS 0024.00 ENDDO
によって先行のゼロを消去している。これによって正しい日数が取得できたので
0025.00 CVTDAT DATE(&DAYSU) TOVAR(&TODATE10) FROMFMT(*JUL) + 0026.00 TOFMT(*YYMD) TOSEP(/)
によって日数( *JUL ) から *YYMD で日付セパレータ / を使って 2012/06/12 のように
表現するようにしている。