2016-04-14 130 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