我在下面的部分写了从日期宏开始的第三个月。
%let date=2017-01-01;
%let a_SASdate=%sysfunc(inputn(&date.,yymmdd10.)) ;
%let b=%sysfunc(putn(&a_SASdate.,yymmn6.)) ;
%let et=%sysfunc(intnx(month,%sysfunc(inputn(&date.,yymmdd10.)),2,s),yymmn6.);
%put &a_SASdate. &b. &et.;
我在下面写了代码来为每个日期创建宏变量。
data new;
do i=1 to 12;
call symput('mon'||put(i,z2.),put(intnx('month',&et.,i),yymmn6.));
a=symget('mon'||put(i,z2.));
output;
end;
run;
预期输出
i a
1 201704
2 201705
3 201706
4 201707
5 201708
6 201709
7 201710
8 201711
9 201712
10 201801
11 201801
12 201803
但我得到的是
1 251204
2 251205
3 251206
4 251207
5 251208
6 251209
7 251210
8 251211
9 251212
10 251301
11 251302
12 251303
出了什么问题?
答案 0 :(得分:2)
因此,您希望从特定日期开始的下一个12个月有年份和月份。我提出了一个更紧凑的解决方案:
%let date= '1jan17'd; /*Begin date*/
data wanted;
do i=1 to 12;
a=intnx('month',&date.,i); /*increment by single month from begin date*/
a=put(a, yymmn6.); /*This formats the date to wanted. */
output;
end;
run;
上相关功能的更多信息
答案 1 :(得分:2)
当& et被解析为201703,这不是SAS日期,所以基于错误的日期,intnx('month',& et。,i)给你错误的结果。因此,您必须首先将& et转换为SAS日期。另外,您只需要定义一个变量,就不需要多个宏变量。
data new;
do i=1 to 12;
call symput('a',put(intnx('month',input("&et",yymmn6.),i),yymmn6.));
a=symget('a');
output;
end;
run;