2016-04-14 181 views
1

我需要创建3个SAS桌子几年,几个月和几个月,这将包括今天的指定范围。我想有一个更聪明的方式做到这一点,但是我最终喜欢的东西(比方说,如果我需要去5年回):SAS宏按日期循环,如何指示正确的步骤?

%macro asd; 

%let today = %sysfunc(today()); 
%let end_year = %sysfunc(intnx(year,&today,-5)); 


proc sql; 
create table years 
(
Years num informat = date9. format = date9. 
); 

insert into years 

%do i = &today. %to &end_year. %by -365; 
%if i = &today.-365 %then %do; 
values(&i.-1) 
%end; 
%else %do; 
values(&i.) 
%end; 
%end; 
; 
quit; 

%mend asd; 
%asd; 
run; 

的问题是,我不知道如何来指示作为一个日期周期的一个步骤,所以我最终得到了确切的数字,这些数字有所不同(年 - 每四年,一个月 - 每两个月,季度 - 每16个季度)。

我添加了一年,试图帐户的循环至少数闰年,但它不工作。所以在继续数月并且可能实现另一个嵌套循环之前,我想问问是否有更简单的方法来创建这样的表?

谢谢! :)

+0

你能告诉你要生成的数据?您想要如何存储日期的例子有助于解释您正在尝试做什么。如果您只想生成日期范围,那么您可以在数据步骤中执行此操作,并避免使用宏代码和SQL。 – Tom

回答

1

更改您的循环以循环使用多少年,然后计算循环内需要的宏变量。

实施例 - 非宏版本。

Do I=1 to 5; 
    Year=intnx('year', date, 1); 

     Rest of code; 
End; 
+0

谢谢!我已经重写了循环,它的工作原理:) '%do i = -1%至-5%by -1; values(%sysfunc(intnx(year,&today。,&i。))) %end;'。 – Kvadich