2014-07-10 65 views
0

你好,我試圖將這個程序中的日期轉換爲數字,程序生成日期爲今天的12個月。我希望結果看起來像第一列「date0」20140731但是我想date0列以及生成的每個列是數字,這可能嗎?SAS Maco程序字符到數字

%global year0 month0 days; 

%let dt=%sysfunc(today()); 
%let year0=%sysfunc(year(&dt)); 
%let month0=%sysfunc(month(&dt),z2); 
%let period=12; 

%macro setlastday(m,y); 
%if &m=12 %then %let days=31; 
%else %if &m=11 %then %let days=30; 
%else %if &m=10 %then %let days=31; 
%else %if &m= 09 %then %let days=30; 
%else %if &m= 08 %then %let days=31; 
%else %if &m= 07 %then %let days=31; 
%else %if &m= 06 %then %let days=30; 
%else %if &m= 05 %then %let days=31; 
%else %if &m= 04 %then %let days=30; 
%else %if &m= 03 %then %let days=31; 
%else %if &m= 02 %then 
%do; 
%if %sysfunc(mod(&y,4))=0 
%then %let days=29; 
%else %let days=28; 
%end; 
%else %if &m= 1 %then %let days=31; 
%mend; 

%macro setdate; 

data TEST; 
%do i=0 %to . 
%global t&i /*ds&i*/; 
%setlastday(&&month&i,&&year&i); 


date&i="&&year&i.&&&month&i.&&days."; 



call symput("t&i",date&i); 


call symput("ds&i", 
"ds&&year&i."||put(&&month&i,z2.)); 


%let j=%eval(&i+1); 
%if %eval(&&month&i)=1 %then 
%do; 
%let year&j=%eval(&&year&i-1); 
%let month&j=12; 
%end; 
%else 
%do; 
%let year&j=%eval(&&year&i); 
%let month&j=%eval(&&month&i-1); 
%end; 
%end; 

run; 
%mend; 

%setdate; 
+1

你爲什麼要這麼做? SAS內置了用於日期計算的函數('intnx','intck'及其親屬)。這是很多代碼來完成一些你可以使用內置函數更容易完成的事情(並且,最重要的是,你將在2100年出現問題,這不是閏年)。 – Joe

+0

這是有幫助的:https://gist.github.com/statgeek/9606118 – Reeza

+0

更不用說,你可以做所有這些,而不使用複雜的宏語法,正如Joe所說的,只需使用內置函數和datastep代碼。 –

回答

0

宏沒有文字/數字的概念,所以你只需要改變這一點:

date&i="&&year&i.&&&month&i.&&days."; 

和刪除引號爲20140731或什麼的,作爲一個數字。

如果你的意思是你希望它是一個合適的SAS日期,你可以使用input,如果你真的是連接到這個錯綜複雜的過程中,或者將其定義爲一個日期常數("DDMONYY"d,所以"31JUL2014"d)。最好是首先使用SAS日期函數。

+0

謝謝喬!這解決了這個問題,我只是練習一些Marco的邏輯來更好地熟悉他們。 – Tim