您好我正在尝试将此程序中的日期转换为数字,该程序生成截至今天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;
答案 0 :(得分:0)
宏没有字符/数字的概念,所以你只需要改变它:
date&i="&&year&i.&&&month&i.&&days.";
并删除引号为20140731或其他任何内容,作为数字。
如果您的意思是希望它成为正确的SAS日期,那么您可以使用input
,如果您确实附加到这个复杂的流程,或者将其定义为日期常量("DDMONYY"d
,那么"31JUL2014"d
)。最好是首先使用SAS日期函数。