2013-09-25 4 views
0

У меня есть функция даты в столбце EIS (EX: 05FEB2007), я хочу зацикливать год от 31DEC2012 до 31DEC2022, но в цикле должен работать как 31DEC2012-EIS до 31DEC2022-EIS.Функция даты в SAS LOOP

%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; 

ответ

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 и просто сравните & лет. (EIS), поскольку вы все равно используете DEC 31.

+0

Я думаю, что настало время для моего «Я бы хотел, чтобы SAS никогда не изобретала«% do », так как это почти наверняка является чистым ущербом для программирования SAS» ... – Joe

+0

Спасибо Джо .. Попробует попробовать. – user2784588