SAS:如何在循环内增加datetime宏变量

时间:2018-07-12 19:17:34

标签: sas

我需要从开始日期(myDate)开始,每隔3天执行一次重复任务,因此,我试图将myDate在循环中增加3,以执行100次。我在语法上遇到了麻烦。

%MACRO DO_LIST (myDate);
%DO I = 1 %TO 100;
    format newDate datetime22.;
    newDate = INTNX('dtday', &myDate, 3);
    call symput('myDate', newDate);
%END;
%mend DO_LIST;

%LET sampleDate  = '01JAN2017:0:0:0'dt;
%DO_LIST (sampleDate);

%put &sampleDate;

这是错误。我试图四处移动,并以不同的方式在循环中进行存储和更新。

NOTE: Line generated by the invoked macro "DO_LIST".
25                                        newDate = INTNX('day', &myDate, 3)  call symput('myDate', newDate);
                                          _______
                                          180

ERROR 180-322: Statement is not valid or it is used out of proper orde

谢谢

1 个答案:

答案 0 :(得分:1)

您正在运行宏循环,而不是数据步骤循环。您将需要使用宏语言和函数,以便在循环中递增变量,并确保返回的值在作用域内是全局的。除非将其结果保存到宏变量中,否则数据步函数在开放代码中不可用。更正后的代码如下:

%MACRO DO_LIST (myDate);
    %global newDate;

    %DO I = 1 %TO 100;
        %let newDate = %sysfunc(INTNX(dtday, &myDate, 3), mdyampm.);
    %END;
%mend DO_LIST;

%LET sampleDate  = '01JAN2017:00:00:00'dt;
%DO_LIST (&sampleDate);

%put &newDate;

等效操作可以在数据步骤循环中完成:

data _null_;
    format newdate mdyampm.;

    do i = 1 to 100;
        newDate = intnx('dtday', '01JAN2017:00:00:00'dt, 3);
    end;

    put newDate;

    call symputx('newdate', newdate, 'G');
run;