0

我在 EIS 列中有一个日期函数(EX:05FEB2007),我想将年份从 31DEC2012 循环到 31DEC2022,但必须在循环中执行 31DEC2012-EIS 到 31DEC2022-EIS 之类的操作。

%MACRO NFORE;
   %LET UC=100;
   %LET YS=2012;
   %DO I = 0 %TO 10;
      %LET YRS=%EVAL(&YS+&I);
      proc sql;
         create table  FORECAST_&YRS  as
         select t.*,
            case when (31DEC&YRS-EIS)/365<=10 then  Segment_10
                 when (31DEC&YRS-EIS)/365<=20 then  Segment_20
                 when (31DEC&YRS-EIS)/365<=30 then  Segment_30
                 when (31DEC&YRS-EIS)/365<=99 then  Segment_35
                 else stat
            end as TSN_AGE_&YRS
         from F_AG t;
      quit;
   %END;
%MEND NFORE;
%NFORE;
4

1 回答 1

0

我会用我的标准“这是一个坏主意,有比在宏循环中生成大量数据集更好的方法(你的问题)”,但这就是说:

%MACRO NFORE;
%LET  UC=100;
%LET YS=2012;

%DO yrs= &ys. %TO %eval(&ys.+10);

proc sql;
create table  FORECAST_&YRS  as
select  *
,case when ("31DEC&YRS."d-EIS)/365<=10 then  Segment_10
      when ("31DEC&YRS."d-EIS)/365<=20 then  Segment_20
      when ("31DEC&YRS."d-EIS)/365<=30 then  Segment_30
      when ("31DEC&YRS."d-EIS)/365<=99 then  Segment_35
      else stat  end as TSN_AGE_&YRS
from F_AG;
quit;
%END;
%MEND NFORE;
%NFORE;

在计算实际年份方面稍微优越的解决方案是使用该INTCK函数来确定日期之间的年份,这将处理闰年 - 甚至YEAR在 EIS 上使用该函数并仅比较 &yrs。到年(EIS),因为无论如何您都在使用 DEC 31。

于 2013-09-25T15:41:38.400 回答