Невозможно выполнить Sas INTCK в макросе - PullRequest
1 голос
/ 10 июля 2019

Я использую следующий макрос:

%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 ноября по любую дату, указанную в качестве аргумента для этого макроса.Я не уверен, где я иду не так, но я получаю следующую ошибку:

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 ]

3 голосов
/ 10 июля 2019

ГГММ6. 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
2 голосов
/ 10 июля 2019

Вы слишком усложняете преобразование строки в дату.Вы уже получили строку в формате 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);
1 голос
/ 11 июля 2019

Предполагая, что ваши даты постоянно в формате ГГГГММ, вы не могли бы просто использовать что-то вроде этого:

%macro diff(yymm);

  %put %eval((%substr(&yymm, 1,4) - 2018)*12 + (%substr(&yymm, 5,2) - 11));

%mend;
...