所以我这里有一个宏,该宏需要yymmn6格式的sas月来计算接下来的2个月。
%macro pull(yymm);
%let month1=%sysfunc(inputn(&yymm.,yymmn6.));
%let month2=%sysfunc(inputn(intnx('month',&month1.,1),yymmn6.));
%let month3=%sysfunc(inputn(intnx('month',&month1.,2),yymmn6.));
%put &month1 &month2 &month3;
%mend;
%pull(201807);
由于收到以下警告,所以我无法理解代码中的错误:
Argument 1 to function INPUTN referenced by the %SYSFUNC or %QSYSFUNC macro function is out of range.
当我检查日志时,&month1表示为21366,理想情况下应该是201807。有人可以在这里帮助我吗?
答案 0 :(得分:2)
每个函数都需要自己的%SYFUNC()包装器,因此您的代码会将文字字符串INTNX(
传递给INPUTN()函数。同样,您不需要在宏代码中的字符串值周围添加引号。因此,请删除MONTH
周围的引号。
因此,首先将您的YYYYMM字符串转换为日期。然后将该日期值传递给INTNX()函数。您可以使用%SYSFUNC()
函数的可选第二个参数来指定将函数结果转换为字符串时要使用的格式。
%macro pull(yymm);
%local date;
%let date=%sysfunc(inputn(&yymm,yymmn6));
%let month1=%sysfunc(intnx(month,&date,0),yymmn6.);
%let month2=%sysfunc(intnx(month,&date,1),yymmn6.);
%let month3=%sysfunc(intnx(month,&date,2),yymmn6.);
%put &month1 &month2 &month3;
%mend;
%pull(201807);
结果:
201807 201808 201809