SAS循环遍历范围内的月底

SAS loop through month-ends in range

假设我有一个图书馆 save,其中包含日常文件 thefile_dly_yyyymmdd

例如save.thefile_dly_20150831, save.thefile_dly_20150901, ..., save.thefile_dly_20210731.

我想对这个库中的历史数据进行一些操作,但是我只想提取特定日期之间的文件,并且只想保留每个月最后一个文件对应的文件,例如我想提取save.thefile_dly_20150831save.thefile_dly_20150930save.thefile_dly_20151031

类似于以下内容。

%macro loop_through(start,end);
 %do i = &start. %to &end.;
    %if %sysunc(exist(SAVE.THEFILE_DLY_&i.)) %then %do;
      /* Do some data processing on the file */
    %end;
 %end;
%mend;

%loop_though(20150831,20210731);

问题在于上述代码将循环遍历 20150831 和 20210731 之间的每个整数,这不是最优的,而且它会处理该月存在的每个文件,而不仅仅是对应于每个月的最后一天。

我该如何调整?任何建议将不胜感激。

要遍历日历间隔,请迭代间隔数。使用 INTNX() 函数计算下一个间隔的日期。使用 INTCK() 函数计算请求的间隔数。

%macro loop_through(start,end);
  %local offset ymd dsname ;
  %do offset = 0 %to %sysfunc(intck(month,&start,&end));
     %let ymd=%sysfunc(intnx(month,&start,&offset,end),yymmddn8.);
     %let dsname=SAVE.THEFILE_DLY_&ymd;
     %if %sysunc(exist(&dsname)) %then %do;
       /* Do some data processing on the file */
     %end;
  %end;
%mend;

%loop_though('01AUG2015'd,'01JUL2021'd);

如果您确实希望允许宏的用户传入 YYYYMMDD 数字字符串而不是实际的 SAS 日期值,则向您的宏添加一些逻辑以将数字字符串转换为实际日期值。例如:

%let start=%sysfunc(inputn(&start,yymmdd8.));