【问题标题】:SAS macro looping by date, how to indicate the correct step?SAS宏按日期循环,如何指示正确的步骤?
【发布时间】:2016-04-14 15:28:07
【问题描述】:

我需要为年、季度和月创建 3 个 SAS 表,其中包含从今天开始的指定范围。我想有一种更聪明的方法可以做到这一点,但我最终得到了类似的东西(比如说,如果我需要回到 5 年前):

    %macro asd;

%let today = %sysfunc(today());
%let end_year = %sysfunc(intnx(year,&today,-5));


proc sql;
create table years
(
Years num informat = date9. format = date9.
);

insert into years

%do i = &today. %to &end_year. %by -365;
%if i = &today.-365 %then %do;
values(&i.-1)
%end;
%else %do;
values(&i.) 
%end;
%end;
;
quit;

%mend asd;
%asd;
run;

问题是我不知道如何将循环中的一个步骤指示为日期期间,所以我最终得到了确切的数字,这些数字会有所不同(对于一年 - 每 4 年,对于一个月 - 每第二个月,季度 - 每 16 个季度)。

我添加了一个循环一年,以尝试至少计算几个闰年,但它不起作用。因此,在继续进行几个月并可能实施另一个嵌套循环之前,我想问一下是否有更简单的方法来创建此类表?

谢谢! :)

【问题讨论】:

  • 你能显示你想要生成的数据吗?您希望如何存储日期期间的示例将有助于解释您要执行的操作。如果您只想生成日期范围,那么您可以在数据步骤中完成,避免使用宏代码和 SQL。

标签: date sas sas-macro do-loops


【解决方案1】:

将循环更改为循环年数,并改为计算循环内所需的宏变量。

示例 - 非宏版本。

 Do I=1 to 5;
     Year=intnx('year', date, 1);

      Rest of code;
 End;

【讨论】:

  • 谢谢!我已经重写了循环并且它可以工作:) %do i = -1 %to -5 %by -1; values(%sysfunc(intnx(year,&today.,&i.))) %end;.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
相关资源
最近更新 更多