我正在运行以下宏:
%macro diff(yymm);
%let date1=%sysfunc(inputn(strip(putn(&yymm.,yymmn6.))||'01',yymmdd10.));
%let date2=%sysfunc(inputn(strip(putn(201811,yymmn6.))||'01',yymmdd10.));
%let j=%sysfunc(intck(month,&date1.,&date2.));
%put &date1. &date2. &j.;
%mend;
%diff(201807);
%diff(201808);
基本上可以找到从18年11月到我作为该宏参数传递的任何月份的月份之间的差异。我不确定我要去哪里错,但是出现以下错误:
Argument 1 to function INPUTN referenced by the %SYSFUNC or %QSYSFUNC macro function is out of range.
NOTE: Mathematical operations could not be performed during %SYSFUNC function execution. The result of the operations have been set
to a missing value.
有人可以在这里帮助我吗?
答案 0 :(得分:3)
YYMMN6。 informat不会将strip(
识别为有效的日期值。如果不将每个函数包装在%sysfunc()
宏函数中,则无法用宏代码调用函数,它们看起来就像是写给宏处理器的字母。
这是您要做什么吗?
%macro diff(yymm);
%put &yymm 201811 %sysfunc(intck(month,%sysfunc(inputn(&yymm, yymmn6.)),'01NOV2018'd));
%mend;
结果:
1104 %diff(201807);
201807 201811 4
1105 %diff(201808);
201808 201811 3
答案 1 :(得分:2)
您使字符串到日期的转换过于复杂。您已经获得了格式为YYMMN6的字符串,只需从该字符串中获取实际的日期值即可。
%macro diff(yymm);
%let date1 = %sysfunc(inputn(&yymm, yymmn6.));
%let date2 = %sysfunc(inputn(201811, yymmn6.));
%let j=%sysfunc(intck(month,&date1.,&date2.));
%put &date1. &date2. &j.;
%mend;
%diff(201807);
%diff(201808);
答案 2 :(得分:1)
那么假设您的日期始终采用YYYYMM格式,那么您是否不能简单地使用以下格式:
%macro diff(yymm);
%put %eval((%substr(&yymm, 1,4) - 2018)*12 + (%substr(&yymm, 5,2) - 11));
%mend;