在循环中创建宏日期

时间:2018-05-07 08:29:52

标签: sas

我在下面的部分写了从日期宏开始的第三个月。

%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

出了什么问题?

2 个答案:

答案 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;

有关IntNxYYMMxw. Format

上相关功能的更多信息

答案 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;