无法在宏中执行Sas INTCK

时间:2019-07-10 17:49:52

标签: date sas macros

我正在运行以下宏:

%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.

有人可以在这里帮助我吗?

3 个答案:

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