本記事では、年月を表すマクロ変数値を、
202207
202208
202209
・・・
・・・
202306
と、1ヶ月ずつ増加させる方法について解説します。
目次
+88を加算する方法
以下は、YYYYMMのMM部分が12になったら、+88を加算して、YYYY部分を一つ繰り上げる方法です。
%macro loop_ym(start, end);
%local ym;
%do ym = &start. %to &end.;
%put &ym.;
%if %substr(&ym., 5, 2) = 12 %then %let ym = %eval(&ym. + 88);
%end;
%mend loop_ym;
%loop_ym(202206, 202307);
12月のときに202212 + 88 = 202300になり、%DOステートメントの先頭に戻ってきたときに、増分値1がインデックス変数値に加算されるので、202301になりループを続けます。
上記では%DOステートメントの%BYを省略しているため、増分値は1になります。
上記を実行すると、以下の結果がログに出力されます。
202206 202207 202208 202209 202210 202211 202212 202301 202302 202303 202304 202305 202306 202307
INTNX関数を使用する方法
以下は年月の増分をINTNX関数で行う方法です。
%macro loop_ym(start, end);
%local ym i;
%let i = 0;
%do %until(&ym. = &end.);
%let ym = %sysfunc(putn(%sysfunc(intnx(month, %sysfunc(inputn(&start., yymmn6.)), &i.)), yymmn6.));
%put &ym.;
%let i = %eval(&i. + 1);
%end;
%mend loop_ym;
%loop_ym(202206, 202307);
INTNX関数の第二引数は日付のシリアル値でなければならないので、INPUTN関数と入力形式YYMMN6.で年月をシリアル値に変換しています。
そして、INTNX関数で年月を増加させたあと、PUTN関数と出力形式YYMMN6.で、シリアル値から年月に戻しています。
上記を実行すると、以下の結果がログに出力されます。
202206 202207 202208 202209 202210 202211 202212 202301 202302 202303 202304 202305 202306 202307