SAS Maco程序Char To Numeric

时间:2014-07-10 22:44:22

标签: sas sas-macro

您好我正在尝试将此程序中的日期转换为数字,该程序生成截至今天12个月的日期。我希望结果看起来像第一列" date0" 20140731但是我希望date0列以及生成的每一列都是数字,这可能吗?

%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 个答案:

答案 0 :(得分:0)

宏没有字符/数字的概念,所以你只需要改变它:

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

并删除引号为20140731或其他任何内容,作为数字。

如果您的意思是希望它成为正确的SAS日期,那么您可以使用input,如果您确实附加到这个复杂的流程,或者将其定义为日期常量("DDMONYY"d,那么"31JUL2014"d)。最好是首先使用SAS日期函数。