変数で日付の計算をする方法

2024年3月23日テクニカルメモ

この記事では、&変数に日付の計算結果を代入する方法を紹介しています。

システムの日付や日付時間を取得する方法

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
2022/10/20 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
2022/10/20(水曜日)に実行した場合

変数の日付要素に加算減算を行う方法

日付要素の加算減算はDTADD関数を利用します。
DT_CURRENT_DATETIME関数で取得した日付時間に対してDTADD関数を適用してください。

DATADD関数の使い方

DTADD(対象の日付,日付の要素,加算や減算する整数値)

日付の要素 DTADD関数の指定例結果例
(HYYMDS型)
補足
YEARDTADD(日付,YEAR,1)2023/10/20 12:34:561年単位
QUARTERDTADD(日付,QUARTER,1)2023/01/20 12:34:563ヶ月単位(四半期単位)
MONTHDTADD(日付,MONTH,1);2022/11/20 12:34:561ヶ月単位
WEEK DTADD(日付,WEEK,1); 2022/10/27 12:34:567日単位(週単位)
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:571秒単位
2022/10/20 12:34:56 に実行した場合

日付の加算減算を行うサンプルプロシジャ

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
2022/10/20 12:34:56 に実行した場合

月初日や月末日、週の開始日や終了日を求める方法

月初日や月末日、週の日付を取得する場合はDTRUNC関数を利用します。

DTRUNC関数の使い方

DTRUNC(対象の日付,求めたい日)

求めたい日DTRUNC関数の指定例意味DT_FORMAT関数の結果例
(YYMD型)
YEARDTRUNC(日付,YEAR)年始2022/01/01
YEAR_ENDDTRUNC(日付,YEAR_END)年末2022/12/31
FISCAL_YEARDTRUNC(日付,FISCAL_YEAR)会計年度の開始日2022/04/01(※1)
FISCAL_YEAR_ENDDTRUNC(日付,FISCAL_YEAR_END)会計年度の終了日2023/03/31(※1)
QUARTERDTRUNC(日付,QUARTER);四半期の開始日2022/10/01(※2)
QUARTER_ENDDTRUNC(日付,QUARTER_END); 四半期の終了日2022/12/31(※2)
MONTHDTRUNC(日付,MONTH); 月初日2022/10/01
MONTH_ENDDTRUNC(日付,MONTH_END); 月末日2022/10/31
WEEKDTRUNC(日付,MINUTE); 週の開始2022/10/16(※3)
WEEK_ENDDTRUNC(日付,SECOND); 州の終了2022/10/22(※3)
2022/10/20 に実行した場合

※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
2022/10/20 12:34:56 に実行した場合

※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/162022/10/22
2月曜日2022/10/172022/10/23
3火曜日2022/10/182022/10/24
4水曜日2022/10/19 2022/10/25
5木曜日2022/10/202022/10/26
6金曜日2022/10/142022/10/20
7土曜日2022/10/152022/10/21
2022/10/20(木曜日)に実行した場合
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