SAS 如何在宏中迭代日期?



我有一个这样的宏:

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

或者如何创建一个宏,在范围的某些天使用一天的工作宏("循环"(?

谢谢。

  • 使用 INTNX(( 递增日期,不要手动操作。
  • 不能在 %LET 语句中使用没有 %SYSFUNC(( 的函数,否则 宏处理器无法分辨什么是文本,什么是函数。
  • 不幸的是,除了你的约会之外,你还有更多的问题,所以我会 向您展示如何循环它,并将其余的留给您。

    %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

最新更新