nヶ月先の同日日付を取得する方法

[OS] ALL
[リリース] ALL
[キーワード] date, INTNX, same date

[質問]

「2004/12/25」から「2005/01/25」、また「2004/12/02」から「2005/02/02」など、基準となる日付からnヵ月後の同日の日付を求めるにはどうしたらよいでしょうか。

[回答]

SAS日付を年月の単位で移動させる関数には、INTNX関数があります。
INTNX関数は、基準となる日付に対し、以下の構文で指定します。

1ヵ月後

  INTNX('MONTH',基準日付,1);
2ヵ月後

  INTNX('MONTH',基準日付,2);

ただしINTNX関数は、デフォルトではnヵ月後の月の初日を返します。
つまり、2004年11月26日を基準日付にした場合、以下のような値を返します。

1ヵ月後 2004年12月1日(に相当するSAS日付値)
2ヵ月後 2005年1月1日(に相当するSAS日付値)

したがって、nヵ月後の同日日付を求めるには少し工夫が必要になります。
以下にプログラム例と解説を記載しますので、参考にしてください。


                                                 /* サンプルデータ作成 */
   DATA days;
     INPUT hizuke YYMMDD10.;
   CARDS;
   2004/01/01
   2000/02/29
   2003/02/28
   2004/12/02
   2004/12/25
   ;
                                                  /* 1ヵ月後の日付計算 */
   DATA temp;
     SET days;
     daydiff = DAY(hizuke)-1;
     monthafter = INTNX('MONTH', hizuke, 1) + daydiff;

     FORMAT hizuke YYMMDD8.
     monthafter YYMMDD8.;
   RUN;

上記のプログラムでは、与えられた基準日付 hizukeがその月の1日から何日後であるかを求め、daydiffに格納します。hizuke が2004年11月26日ならば、daydiffは25となります。

ここで、「1ヵ月後の日付 = 1ヵ月後の月初 + daydiff」と考えられますので、INTNX関数を使用して1ヵ月後の日付を求めています。
ただし上記のプログラムでは、うるう年でない年の1月29日の1ヶ月後の日付は、2月29日が存在しないために「3月1日」となりますのでご注意ください。