【问题标题】:SAS How iterate on date in macro?SAS如何在宏中迭代日期?
【发布时间】:2019-02-04 09:54:56
【问题描述】:

我有一个这样的宏:

%macro loop(report_date);
    /* some sql-code with where-statement on report_date:
         create table with name small_table */
%mend;

然后我想编写一个创建表的代码:该表是表的联合,其中变量 report_day 的条件为真。 但我的代码不起作用:

%let days_number = 31;
%let Min_Date = '01Jan2018:00:00:00'dt;
/* create table with name big_table */



/*this macro creates a union table */
%macro doInLoop(report_date);
    %loop(&report_date.);

    PROC SQL;
        CREATE TABLE Big_table AS
        SELECT *
        FROM big_table
        UNION ALL
        SELECT *
        FROM small_table;
    QUIT;

%mend;

%macro createTable;

    %local j;
    %do j = 1 to &days_number.;
        %let rep_date = dhms(datepart(&Min_Date.) + j, 0, 0, 0); 

        %if day(rep_date) = 1 %then %doInLoop(%rep_date);
    %end;

%mend;

%createTable;

我的消息有 31 个错误: "错误:在贡献表中未找到以下列:j"

或者我怎样才能创建一个宏,它使用一个工作宏一天(“循环”),在范围内的某些天?

谢谢。

【问题讨论】:

    标签: sql date macros sas conditional-statements


    【解决方案1】:
    • 使用 INTNX() 来增加您的日期,不要手动操作。
    • 您不能在没有 %SYSFUNC() 的情况下在 %LET 语句中使用函数,否则 宏处理器无法分辨什么是文本,什么是函数。
    • 很遗憾,您还有更多的问题,而不仅仅是约会,所以我会 向您展示如何循环播放,剩下的交给您。

      %let rep_date = %sysfunc(intnx(DTDAY, &min_date, 1, 's');
      

    DTDAY 指定日期时间变量的天间隔。如果您有一个日期变量,则间隔将为 DAY。

    记得用 &rep_date 引用 rep_date,否则它只是 SAS 的文本。

    您可能会发现宏附录中的示例宏很有帮助。一个说明了日期循环。 https://documentation.sas.com/?docsetId=mcrolref&docsetTarget=n01vuhy8h909xgn16p0x6rddpoj9.htm&docsetVersion=9.4&locale=en

    【讨论】:

    • 谢谢!这不是决定,但我可以解决这个问题:%let rep_date = %sysfunc(intnx(dtday, &Min_Date., &j., s));%if %sysfunc(day(%sysfunc(datepart(&rep_date.)))) eq 1 %then %doInLoop(&rep_date., &j.);(简单条件。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多