SAS如何在宏中对日期进行迭代?

时间:2018-08-29 14:45:51

标签: sql date macros sas conditional-statements

我有一个这样的宏:

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

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

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

或者如何创建一个宏,该宏在范围内的某些天中使用一天(“循环”)的工作宏?

谢谢。

1 个答案:

答案 0 :(得分:0)

  • 使用INTNX()来增加日期,请不要手动进行。
  • 没有%SYSFUNC()的情况下,不能在%LET语句中使用函数,否则 宏处理器无法分辨出什么是文本,什么是函数。
  • 很遗憾,您的问题还不只是您的约会,所以我会 向您展示如何循环播放,其余内容留给您。

          set PATH="C:\Program Files\Java\jdk-10.0.1\bin";%PATH%
    
          set CLASSPATH=.;C:\apache-tomcat-7.0.34\lib\servlet-api.jar;C:\apache-tomcat-7.0.34\lib\jsp-api.jar;C:\apache-tomcat-7.0.34\lib\el-api.jar;C:\apache-tomcat-7.0.34\lib\commons-beanutils-1.8.3.jar;C:\apache-tomcat-7.0.34\mongo-java-driver-3.1.0.jar;C:\apache-tomcat-7.0.34\lib\gson-2.3.1.jar
    
          set ANT_HOME=C:\apache-tomcat-7.0.34
    
          set TOMCAT_HOME=C:\apache-tomcat-7.0.34
    
          set CATALINA_HOME=C:\apache-tomcat-7.0.34
    

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

请记住以&符号引用rep_date,&rep_date,否则只是发给SAS的文本。

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