本日を起点とした日付範囲の条件設定方法

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

この記事では、IN_PERIOD 関数を用いた日付条件の設定方法について紹介しています。

当日起点の日付範囲を判定

IN_PERIOD 関数を利用すると簡単に「1年分」「3ヶ月分」といったような日付範囲を判定することができます。

IN_PERIOD 関数の使い方

少し特殊なFROM-TOの考え方がありますので、注意してください。
WebFOCUSの他の関数では過去の日付を条件にしたい時は、FROM日付を演算で求める処理が必要でしたが、IN_PERIOD 関数では当日から範囲を指定する考え方になります。

IN_PERIOD(日付項目,日付要素,開始位置FROM,終了範囲TO)

引数説明
日付項目日付(YYMD型等)か日付時間(HYYMDS型等)である必要があります
日付要素日付範囲の要素名を指定します。下の表に詳細を記載しています。
開始位置
FROM
本日から過去へ戻る日付の開始位置を数値で指定します。
0は開始位置を現在にします。(日付要素がYEARなら今年、MONTHなら今月)
1は開始位置を1つ過去にします。(日付要素がYEARなら昨年、MONTHなら先月)
2は開始位置を2つ過去にします。(日付要素がYEARなら一昨年、MONTHなら先々月)
終了範囲
TO
FROMを開始位置としてTOとなる終了範囲の指定です。
0は終了範囲を現在までにします。(日付要素がYEARなら今年すべて、DAYなら本日まで)
1は終了範囲を開始位置から1つにします。(日付要素がYEARでFROMが5の場合は、今年から5年前を開始位置として1年分を取得)
2は終了範囲を開始位置から2つにします。(日付要素がYEARでFROMが0の場合は、今年を開始位置として2年分[今年と来年]を取得)

日付要素の種類については、以下のようなものがあります。

会計年度の開始月は「SET FY_FIRST_MONTH=4」にて4月にしています。
週の開始曜日は「SET WEEKFIRST=ISO2」にて月曜日にしています。

日付要素意味指定例対象となる日付範囲例
実行日は2022/10/20(木)
会計年度は4月から
週の開始は月曜日
YEAR
(全期間)
IN_PERIOD(日付,YEAR,0,0)
IN_PERIOD(日付,YEAR,2,0)
IN_PERIOD(日付,YEAR,2,1)
IN_PERIOD(日付,YEAR,0,2)
2022/01/01~2022/12/31
2020/01/01~2022/12/31
2020/01/01~2020/12/31
2022/01/01~2023/12/31
YTD
(初日から今日まで)
IN_PERIOD(日付,YTD,0,0)
IN_PERIOD(日付,YTD,2,0)
IN_PERIOD(日付,YTD,2,1)
IN_PERIOD(日付,YTD,0,2)
2022/01/01~2022/10/20
2020/01/01~2022/10/20
2020/01/01~2020/10/20
2022/01/01~2023/10/20
FISCAL_YEAR会計年度
(全期間)
IN_PERIOD(日付,FISCAL_YEAR,0,0)
IN_PERIOD(日付,FISCAL_YEAR,2,0)
IN_PERIOD(日付,FISCAL_YEAR,2,1)
IN_PERIOD(日付,FISCAL_YEAR,0,2)
2022/04/01~2023/03/31
2020/04/01~2023/03/31
2020/04/01~2021/03/31
2022/04/01~2024/03/31
FISCAL_YTD会計年度
(初日から今日)
IN_PERIOD(日付,FISCAL_YTD,0,0)
IN_PERIOD(日付,FISCAL_YTD,2,0)
IN_PERIOD(日付,FISCAL_YTD,2,1)
IN_PERIOD(日付,FISCAL_YTD,0,2)
2022/04/01~2022/10/20
2020/04/01~2022/10/20
2020/04/01~2020/10/20
2022/04/01~2023/10/20
QUARTER四半期
(全期間)
IN_PERIOD(日付,QUARTER,0,0)
IN_PERIOD(日付,QUARTER,2,0)
IN_PERIOD(日付,QUARTER,2,1)
IN_PERIOD(日付,QUARTER,0,2)
2022/10/01~2022/12/31
2022/04/01~2022/12/31
2022/04/01~2022/06/30
2022/10/01~2023/03/31
QTD四半期
(初日から今日)
IN_PERIOD(日付,QTD,0,0)
IN_PERIOD(日付,QTD,2,0)
IN_PERIOD(日付,QTD,2,1)
IN_PERIOD(日付,QTD,0,2)
2022/10/01~2022/10/20
2022/04/01~2022/10/20
2022/04/01~2022/04/20
2022/10/01~2023/01/20
MONTH
(全期間)
IN_PERIOD(日付,MONTH,0,0)
IN_PERIOD(日付,MONTH,2,0)
IN_PERIOD(日付,MONTH,2,1)
IN_PERIOD(日付,MONTH,0,2)
2022/10/01~2022/10/31
2022/08/01~2022/10/31
2022/08/01~2022/08/31
2022/10/01~2022/11/30
MTD
(初日から今日)
IN_PERIOD(日付,MTD,0,0)
IN_PERIOD(日付,MTD,2,0)
IN_PERIOD(日付,MTD,2,1)
IN_PERIOD(日付,MTD,0,2)
2022/10/01~2022/10/20
2022/08/01~2022/10/20
2022/08/01~2022/08/20
2022/10/01~2022/11/20
WEEK
(全期間)
IN_PERIOD(日付,WEEK,0,0)
IN_PERIOD(日付,WEEK,2,0)
IN_PERIOD(日付,WEEK,2,1)
IN_PERIOD(日付,WEEK,0,2)
(月曜)~(日曜)
2022/10/17~2022/10/23
2022/10/03~2022/10/23
2022/10/03~2022/10/09
2022/10/17~2022/10/30
DAYIN_PERIOD(日付,DAY,0,0)
IN_PERIOD(日付,DAY,2,0)
IN_PERIOD(日付,DAY,2,1)
IN_PERIOD(日付,DAY,0,2)
2022/10/20~2022/10/20
2022/10/18~2022/10/20
2022/10/18~2022/10/18
2022/10/20~2022/10/21
CUSTOM_FROM_TO
(FROM-TO)
IN_PERIOD(日付
,CUSTOM_FROM_TO
,20221001,20221130)
2022/10/01~2022/11/30
2022/10/20(木)に実行した場合

WHEREで使う

WHEREで利用する場合は、IN_PERIOD 関数をそのまま指定します。
GUI ツール等では直接書き込みができないため、シノニムを編集して「フィルタ」として作成しておく必要があります。

今月で絞り込むサンプル

今月を起点としてデータを抽出しています。

DEFINE FILE GGSALES
 TESTDATE/YYMD = DTADD('20101231',DAY,SEQ);
END
TABLE FILE GGSALES
 PRINT TESTDATE SEQ
 WHERE IN_PERIOD(TESTDATE,MONTH,0,0)
END

今月と前年同月で絞り込むサンプル

上記にプラスして、前年同月(12か月前から1か月分)を取得しています。

DEFINE FILE GGSALES
 TESTDATE/YYMD = DTADD('20101231',DAY,SEQ);
END
TABLE FILE GGSALES
 PRINT TESTDATE SEQ
 WHERE IN_PERIOD(TESTDATE,MONTH,0,0)
    OR IN_PERIOD(TESTDATE,MONTH,12,1)
END

一時項目で使う

IN_PERIOD 関数は対象となる日付の判定を行い、対象であれば「1」それ以外は「0」を整数で返します。例えば、2022年10月20日に今月を取得すると以下のような結果になります。

今月を判定するサンプル

DEFINE FILE GGSALES
 TESTDATE/YYMD = DTADD('20101231',DAY,SEQ);
 FLG/I4        = IN_PERIOD(TESTDATE,MONTH,0,0);
END
TABLE FILE GGSALES
 PRINT TESTDATE SEQ FLG
END

今月を判定した一時項目で絞り込みを行うサンプル

GUIツールで IN_PERIOD 関数を利用する場合は、このサンプルのように一時項目に対してフィルタ条件を設定します。

DEFINE FILE GGSALES
 TESTDATE/YYMD = DTADD('20101231',DAY,SEQ);
 FLG/I4        = IN_PERIOD(TESTDATE,MONTH,0,0);
END
TABLE FILE GGSALES
 PRINT TESTDATE SEQ FLG
 WHERE FLG EQ 1
END

今月と前年同月を並べるサンプル

上述の内容を組み合わせたサンプルです。
今月は「IN_PERIOD(TESTDATE,MONTH,0,0) EQ 1」
前年同月は「IN_PERIOD(TESTDATE,MONTH,12,1) EQ 1」
が対象となります。

DEFINE FILE GGSALES
 TESTDATE/YYMD = DTADD('20101231',DAY,SEQ);
 MONTH/M       = TESTDATE;
 TOUGETSU/P20  = IF IN_PERIOD(TESTDATE,MONTH,0,0) EQ 1 THEN DOLLARS ELSE 0;
 ZENNEN/P20    = IF IN_PERIOD(TESTDATE,MONTH,12,1) EQ 1 THEN DOLLARS ELSE 0;
END
TABLE FILE GGSALES
 SUM 
  TOUGETSU AS '当月'
  ZENNEN   AS '前年同月'
 BY CATEGORY
 BY MONTH AS '月'
 WHERE IN_PERIOD(TESTDATE,MONTH,0,0)
    OR IN_PERIOD(TESTDATE,MONTH,12,1)
END

システム日付を設定するSETコマンド(デバッグ用)

一時的に日付を設定して実行したい場合は「SET TESTDATE=yyyymmdd」を利用します。

SET TESTDATE = 20221102
-RUN

~処理~