2012年5月28日月曜日

年代の書式定義

仕事用のメモです。4月始まりで年代を分けるための書式定義です。

  1. options mprint source;  
  2.   
  3. %macro date_fmt(from=, to=, fmt=, fmtnam=);  
  4.         %local i tcount;  
  5.   
  6.         data _null_;  
  7.                 format from to end yymmddn8.;  
  8.   
  9.                 from = &from;  
  10.                 end = &to;  
  11.                 tcount = 0;  
  12.   
  13.                 do while (from < end);  
  14.                         to = intnx('MONTH', from, +11, 'END');  
  15.                         tcount = tcount + 1;  
  16.   
  17.                         /* マクロ変数を定義 */  
  18.                         value = put(from, &fmt);  
  19.                         macvar = compress("FROM" || put(tcount, BEST.));  
  20.                         call symput(macvar, compress(value));  
  21.   
  22.                         value = put(to, &fmt);  
  23.                         macvar = compress("TO" || put(tcount, BEST.));  
  24.                         call symput(macvar, compress(value));  
  25.   
  26.                         call symput("TCOUNT", compress(put(tcount, BEST.)));  
  27.   
  28.                         /* 次の年を設定 */  
  29.                         from = intnx('MONTH', from, +12);  
  30.                 end;  
  31.         run;  
  32.   
  33.         /* 書式を設定 */  
  34.         proc format;  
  35.                 value &fmtnam  
  36.                         %do i=1 %to &tcount;  
  37.                                 "&&from&i" - "&&to&i" = "&&from&i - &&to&i"  
  38.                         %end;  
  39.                 ;  
  40.         run;  
  41. %mend;  
  42.   
  43. %date_fmt(from='1-Apr-1990'd, to=today(), fmt=YYMMN6., fmtnam=$DATE6_F);  
  44. %date_fmt(from='1-Apr-1990'd, to=today(), fmt=YYMMDDN8., fmtnam=$DATE8_F);  
  45.   
  46. data _null_;  
  47.         x = put(today(), yymmddn.);  
  48.         y = put(x, $DATE8_F.);  
  49.         z = put(x, $DATE6_F.);  
  50.         put _all_;  
  51. run;  

0 件のコメント :

コメントを投稿