変数で日付の計算をする方法
この記事では、&変数に日付の計算結果を代入する方法を紹介しています。
システムの日付や日付時間を取得する方法
WebFOCUSではシステム日付の&変数(&YYMD、&DATEYYMD等)が用意されていますが、日付の計算を行う場合は関数を利用する必要があります。関数を利用して日付を取得すると内部的に日付型として扱うことができるため、日付の演算を関数で行うことができるようになります。
DT_CURRENT_DATETIME関数を使うとシステムの日付や時間を取得することができます。
DT_FORMAT関数にて日付型のデータを文字に変換して表示できるようになります。
DT_CURRENT_DATETIME関数、DT_FORMAT関数の使い方
DT_CURRENT_DATETIME(時間粒度)
DT_CURRENT_DATETIME(時間粒度)
時間粒度 | 意味 |
---|---|
SECOND | 秒まで取得 「yyyy/mm/dd hh:mm:ss」形式 |
MILLISECOND | ミリ秒まで取得 「yyyy/mm/dd hh:mm:ss.sss」形式 |
MICROSECOND (利用しません) | マイクロ秒まで取得 「yyyy/mm/dd hh:mm:ss.mmmmmm」形式 |
DT_FORMAT(文字にしたい日付,’文字にする日付フォーマット’)
DT_FORMAT(文字にしたい日付,’文字にする日付フォーマット’)
文字にする日付フォーマット | 意味 |
---|---|
HYYMDS | 日付と時間 「yyyy/mm/dd hh:mm:ss」形式 |
HYYMDs | 日付と時間(ミリ秒まで) 「yyyy/mm/dd hh:mm:ss.sss」形式 |
HYYMD | 日付のみ 「yyyy/mm/dd」形式 |
HHIS | 時間のみ 「hh:mm:ss」形式 |
文字型に変換後の表示例(日付フォーマットは他にも様々あります)
システムの日付時間を取得するサンプルプロシジャ
実行したタイミングのシステム日付時間を取得する場合の書き方になります。
-TYPE コマンドを利用すると、&変数の値をブラウザ画面に出力することができます。
-SET &SYSTEMTIME = DT_CURRENT_DATETIME(SECOND);
-SET &DATETIME = DT_FORMAT(&SYSTEMTIME,'HYYMDS');
-SET &DATE = DT_FORMAT(&SYSTEMTIME,'HYYMD');
-SET &TIME = DT_FORMAT(&SYSTEMTIME,'HHIS');
-TYPE DATETIME : &DATETIME
-TYPE DATE : &DATE
-TYPE TIME : &TIME
システムの日付時間を取得した結果例
変数名 | 意味 | 内部的な型 | 表示例 |
---|---|---|---|
&SYSTEMTIME | 「yyyy/mm/dd hh:mm:ss」形式 | 日付時間型 | (画面表示できません) |
&DATETIME | 「yyyy/mm/dd hh:mm:ss」形式 | 文字型 | 2022/10/20 12:34:56 |
&DATE | 「yyyy/mm/dd」形式 | 文字型 | 2022/10/20 |
&TIME | 「hh:mm:ss」形式 | 文字型 | 12:34:56 |
(補足)日付のみ、もしくは時間のみで良い場合
DT_CURRENT_DATETIME関数では、日付と時間の両方を取得します。
日付のみで良い場合は「DT_CURRENT_DATE」関数、時間のみで良い場合は「DT_CURRENT_TIME」関数を利用します。
DT_CURRENT_DATE()
「DT_CURRENT_DATE」関数を利用する場合、時間部分はすべてゼロになります。
DT_CURRENT_TIME(時間粒度)
「DT_CURRENT_TIME」関数を利用する場合、日付部分は取得されません。
時間の粒度の指定は、DT_CURRENT_DATETIME関数と同様の表(上記)を参考にしてください。
(補足)曜日を取得したい場合
DAYNAME関数の引数に日付を指定することで、曜日の名前を取得できます。
DAYNAME(日付値を指定)
曜日を取得するサンプルプロシジャ
-SET &SYSTEMDATE = DT_CURRENT_DATE();
-SET &RESULT = DT_FORMAT(&SYSTEMDATE,'HYYMD');
-SET &YOUBI = DAYNAME(&SYSTEMDATE);
-TYPE &RESULT &YOUBI
曜日を取得した結果例
変数名 | 意味 | 内部的な型 | 表示例 |
---|---|---|---|
&SYSTEMTIME | 「yyyy/mm/dd hh:mm:ss」形式 | 日付時間型 | (画面表示できません) |
&RESULT | 「yyyy/mm/dd」形式 | 文字型 | 2022/10/20 |
&YOUBI | 曜日の名前(英語) | 文字型 | Wednesday |
2022/10/20(水曜日)に実行した場合
変数名 | 意味 | 内部的な型 | 表示例 |
---|---|---|---|
&SYSTEMTIME | 「yyyy/mm/dd hh:mm:ss」形式 | 日付時間型 | (画面表示できません) |
&RESULT | 「yyyy/mm/dd」形式 | 文字型 | 2022/10/20 |
&YOUBI | 曜日の名前(英語) | 文字型 | Wednesday |
変数の日付要素に加算減算を行う方法
日付要素の加算減算はDTADD関数を利用します。
DT_CURRENT_DATETIME関数で取得した日付時間に対してDTADD関数を適用してください。
DATADD関数の使い方
DTADD(対象の日付,日付の要素,加算や減算する整数値)
日付の要素 | DTADD関数の指定例 | 結果例 (HYYMDS型) | 補足 |
---|---|---|---|
YEAR | DTADD(日付,YEAR,1) | 2023/10/20 12:34:56 | 1年単位 |
QUARTER | DTADD(日付,QUARTER,1) | 2023/01/20 12:34:56 | 3ヶ月単位(四半期単位) |
MONTH | DTADD(日付,MONTH,1); | 2022/11/20 12:34:56 | 1ヶ月単位 |
WEEK | DTADD(日付,WEEK,1); | 2022/10/27 12:34:56 | 7日単位(週単位) |
DAY | DTADD(日付,DAY,1); | 2022/10/21 12:34:56 | 1日単位 |
HOUR | DTADD(日付,HOUR,1); | 2022/10/20 13:34:56 | 1時間単位 |
MINUTE | DTADD(日付,MINUTE,1); | 2022/10/20 12:35:56 | 1分単位 |
SECOND | DTADD(日付,SECOND,1); | 2022/10/20 12:34:57 | 1秒単位 |
日付の加算減算を行うサンプルプロシジャ
1年後を求める場合は以下のような書き方になります。
-SET &SYSTEMTIME = DT_CURRENT_DATETIME(SECOND);
-SET &RESULT = DTADD(&SYSTEMTIME,YEAR,1);
-SET &RESULT = DT_FORMAT(&RESULT,'HYYMDS');
-TYPE RESULT:&RESULT
日付の加算減算を行った結果例
変数名 | 意味 | 内部的な型 | 表示例 |
---|---|---|---|
&SYSTEMTIME | 「yyyy/mm/dd hh:mm:ss」形式 | 日付時間型 | (画面表示できません) |
&RESULT | 「yyyy/mm/dd」形式 | 文字型 | 2023/10/20 12:34:56 |
月初日や月末日、週の開始日や終了日を求める方法
月初日や月末日、週の日付を取得する場合はDTRUNC関数を利用します。
DTRUNC関数の使い方
DTRUNC(対象の日付,求めたい日)
求めたい日 | DTRUNC関数の指定例 | 意味 | DT_FORMAT関数の結果例 (YYMD型) |
---|---|---|---|
YEAR | DTRUNC(日付,YEAR) | 年始 | 2022/01/01 |
YEAR_END | DTRUNC(日付,YEAR_END) | 年末 | 2022/12/31 |
FISCAL_YEAR | DTRUNC(日付,FISCAL_YEAR) | 会計年度の開始日 | 2022/04/01(※1) |
FISCAL_YEAR_END | DTRUNC(日付,FISCAL_YEAR_END) | 会計年度の終了日 | 2023/03/31(※1) |
QUARTER | DTRUNC(日付,QUARTER); | 四半期の開始日 | 2022/10/01(※2) |
QUARTER_END | DTRUNC(日付,QUARTER_END); | 四半期の終了日 | 2022/12/31(※2) |
MONTH | DTRUNC(日付,MONTH); | 月初日 | 2022/10/01 |
MONTH_END | DTRUNC(日付,MONTH_END); | 月末日 | 2022/10/31 |
WEEK | DTRUNC(日付,MINUTE); | 週の開始 | 2022/10/16(※3) |
WEEK_END | DTRUNC(日付,SECOND); | 州の終了 | 2022/10/22(※3) |
※1:会計年度の指定(FY_FIRST_MONTH)
会計年度の開始月は「SET FY_FIRST_MONTH=n」にて、1~12の間で指定します。
会計年度の開始日を求めるサンプルプロシジャ
会計年度の開始月が4月の場合は、以下のような書き方になります。
SET FY_FIRST_MONTH=4
-RUN
-SET &SYSTEMTIME = DT_CURRENT_DATETIME(SECOND);
-SET &RESULT = DTRUNC(&SYSTEMTIME,FISCAL_YEAR);
-SET &RESULT = DT_FORMAT(&RESULT,'YYMD');
-TYPE RESULT:&RESULT
会計年度の開始日を求めた結果例
変数名 | 意味 | 内部的な型 | 表示例 |
---|---|---|---|
&SYSTEMTIME | 「yyyy/mm/dd hh:mm:ss」形式 | 日付時間型 | (画面表示できません) |
&RESULT | 「yyyy/mm/dd」形式 | 文字型 | 2022/04/01 |
※2:四半期
四半期の開始と終了は以下の期間です。
対象の日付期間 | 四半期の開始日 | 四半期の終了日 |
---|---|---|
1月1日~3月31日 | 1月1日 | 3月31日 |
4月1日~6月30日 | 4月1日 | 6月30日 |
7月1日~9月30日 | 7月1日 | 9月30日 |
10月1日~12月31日 | 10月1日 | 12月31日 |
※3:週の開始曜日の指定(WEEKFIRST)
週の開始曜日は「SET WEEKFIRST=n」で指定します。
DTRUNC関数で週の開始日を取得する場合は、週の開始曜日の設定が影響します。
週番号の指定の種類は「1~7」だけではなく、ISO標準に従った「ISO1~7」や「STD1~7」等の複数種類ありますが、こちらは他の関数で週番号を取得する時に使い分ける場合があります。
WEEKFIRSTの指定 週番号 | 開始曜日 | 週の開始日 | 週の終了日 |
---|---|---|---|
1 | 日曜日 | 2022/10/16 | 2022/10/22 |
2 | 月曜日 | 2022/10/17 | 2022/10/23 |
3 | 火曜日 | 2022/10/18 | 2022/10/24 |
4 | 水曜日 | 2022/10/19 | 2022/10/25 |
5 | 木曜日 | 2022/10/20 | 2022/10/26 |
6 | 金曜日 | 2022/10/14 | 2022/10/20 |
7 | 土曜日 | 2022/10/15 | 2022/10/21 |
SET WEEKFIRST=ISO2
-RUN
-SET &SYSTEMTIME = DT_CURRENT_DATETIME(SECOND);
-SET &RESULT1 = DTRUNC(&SYSTEMTIME,WEEK);
-SET &RESULT1 = DT_FORMAT(&RESULT1,'YYMD');
-SET &RESULT2 = DTRUNC(&SYSTEMTIME,WEEK_END);
-SET &RESULT2 = DT_FORMAT(&RESULT2,'YYMD');
-TYPE RESULT1:&RESULT1
-TYPE RESULT2:&RESULT2
月末日を求めるサンプルプロシジャ
月末日を求める場合は以下のような書き方になります。
DTRUNC関数の計算結果を変数で文字にする場合、DT_FORMAT関数の引数では日付時間型の「HYYMDS」ではなく、日付型の「YYMD」を指定するようにします。
-SET &SYSTEMTIME = DT_CURRENT_DATETIME(SECOND);
-SET &RESULT = DTRUNC(&SYSTEMTIME,MONTH_END);
-SET &RESULT = DT_FORMAT(&RESULT,'YYMD');
-TYPE RESULT:&RESULT
来月の月末日を求める方法
上述の内容の組み合わせになりますので、説明は割愛します。
-SET &SYSTEMTIME = DT_CURRENT_DATETIME(SECOND);
-SET &RESULT = DTADD(&SYSTEMTIME ,MONTH,1);
-SET &RESULT = DTRUNC(&RESULT ,MONTH_END);
-SET &RESULT = DT_FORMAT(&RESULT ,'YYMD');
-TYPE RESULT :&RESULT
日数差(期間差)を求める方法
日数差(期間差)を求める場合は、DTDIFF関数を利用します。
DTDIFF関数の使い方
DTDIFF(後ろの日付,前の日付,比較する要素)
比較する要素 | 意味 |
---|---|
YEAR | 年数差 |
QUARTER | 四半期差 |
MONTH | 月数差 |
WEEK | 週数差 |
DAY | 日数差 |
HOUR | 時間数差 |
MINUTE | 分数差 |
SECOND | 秒数差 |
日数差を求めるサンプルプロシジャ
日数差(期間差)を求める場合は、DTDIFF関数を利用します。
このサンプルでは2022年10月20日に実行した際に月末日(2022年10月31日)との日数差を求めていますので、結果としては「11(日)」が返ります。
-SET &SYSTEMTIME = DT_CURRENT_DATETIME(SECOND);
-SET &GETSUMATSU = DTRUNC(&SYSTEMTIME,MONTH_END);
-SET &NUMBER_OF_DAY = DTDIFF(&GETSUMATSU,&SYSTEMTIME,DAY);
-TYPE NUMBER_OF_DAY:&NUMBER_OF_DAY
任意の文字列やパラメータを日付に変換したい場合
該当の変数や日付の文字(yyyymmddやyyyy/mm/dd hh:mm:ss)をDT関数で囲みます。
以下のサンプルでは、&PRM に日付(yyyy/mm/ddやyyyymmdd)が代入される場合を想定しています。
-DEFAULTH &PRM = '2022/01/01';
-SET &SYSTEMTIME = DT(&PRM);
-SET &GETSUMATSU = DTRUNC(&SYSTEMTIME,MONTH_END);
-SET &NUMBER_OF_DAY = DTDIFF(&GETSUMATSU,&SYSTEMTIME,DAY);
-TYPE NUMBER_OF_DAY:&NUMBER_OF_DAY
日付の計算がうまくできているか確認したい場合
デバッグ用のコマンドで「SET TESTDATE=yyyymmdd」を指定します。
以下の例では、2021年12月31日に実行されたと仮定して来月末を取得することができます。
結果として、20220131(2022年1月31日)を取得されます。
SET TESTDATE=20211231
-RUN
-SET &SYSTEMTIME = DT_CURRENT_DATETIME(SECOND);
-SET &RESULT = DTADD(&SYSTEMTIME ,MONTH,1);
-SET &RESULT = DTRUNC(&RESULT ,MONTH_END);
-SET &RESULT = DT_FORMAT(&RESULT ,'YYMD');
-TYPE RESULT :&RESULT