Цикл SAS для даты начала и окончания - PullRequest
0 голосов
/ 10 мая 2019

У меня есть код, где я беру дату начала и дату окончания от пользователя и выполняю макрос для этих двух дат.

%let mon_last=31MAR2019;
%let mon_first=01JAN2019;
%macro call();
data _null_;
array datelist {2} "&mon_first"d "&mon_last"d;
%do i=1 %to 2;
    %let yrmon1=%sysfunc(inputn(datelist{i},mmddyy10.), date9.));
    %let yrmon=%sysfunc(putn(&yrmon1,date9.),yymmn6.);
    %let yr=%sysfunc(year(&yrmon1),4);
    %let mon=%sysfunc(month(&yrmon1),z2);
    %datapull(&yrmon., &yr., &mon.);
%end;
%mend;
%call();

Но я получаю следующую ошибку в зависимости от того, как япопробуй:

WARNING: 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.
ERROR: The function PUTN referenced by the %SYSFUNC or %QSYSFUNC macro function has too few arguments.

1 Ответ

1 голос
/ 10 мая 2019

Макропроцессор рассматривает все как строку.Вы не можете преобразовать строку datelist{i} в значение даты.

Похоже, вы хотите иметь макрос, который может принимать в качестве входных данных список строк в формате, который можно преобразовать в значения даты и использоватьдля вызова другого макроса.

%macro call(date_list);
%local i yrmon yr mon;
%do i=1 %to %sysfunc(countw(&date_list));
    %let yrmon=%sysfunc(inputn(%scan(&date_list,&i),date11.),yymmn6.);
    %let yr=%substr(&yrmon,1,4);
    %let mon=%substr(&yrmon,5);
    %datapull(&yrmon., &yr., &mon.);
%end;
%mend;
%call(31MAR2019 01JAN2019);

Если вместо этого вы хотите обрабатывать каждый месяц от начала до конца, то вам нужен другой макрос с разными входами.В этом случае вам просто нужно два входа, каждый из которых может иметь только одно значение.

На этот раз давайте закодируем его так, чтобы бремя предоставления действительных значений даты ложилось на вызывающую сторону макроса вместо принятия строк символов, которые необходимо преобразовать в даты.

%macro call(start,end);
%local i yrmon yr mon;
%do i=0 %to %sysfunc(intck(month,&start,&end));
    %let yrmon=%sysfunc(intnx(month,&start,&i),yymmn6.);
    %let yr=%substr(&yrmon,1,4);
    %let mon=%substr(&yrmon,5);
    %datapull(&yrmon., &yr., &mon.);
%end;
%mend;
%call("01JAN2019"d,"31MAR2019"d);
...