SAS MACRO 到循环月结束日期

标签 sas sas-macro

我有一组代码,我正在手动调整月末日期。运行和使用日期的查询已离开连接以提取每个声明日期的数据。我一直在研究宏,因为将所有日期一直更改一个月直到最近完成的月份是一项劳动密集型工作。必须有一种方法可以遍历并将每个声明的月末日期更改一个月,然后循环运行查询,直到它到达最近完成的月末日期。

因此,在下面的程序完全运行之后,它会将每个声明日期增加一个月并显示月末日期。运行的每个数据集都是 BEDT。所以第一次运行将是 2018 年 1 月,依此类推。

有人可以协助或指出正确的方向吗?我已经阅读了这么多文档,却一无所获。提前致谢。

%Let BEdt='01JAN2018'd

%let dt1='28FEB2018'
%let dt2='31MAR2018'
%let dt3='30APR2018'
%let dt4='31MAY2018'
%let dt5='30JUN2018'
%let dt6='31JUL2018'
%let dt7='31AUG2018'
%let dt8='30SEP2018'
%let dt9='31OCT2018'
%let dt10='30NOV2018'
%let dt12='31DEC2018'
%let dt12='31JAN2019'

最佳答案

让我们使用具有开始日期和要提取的月数的内容。我们将使用 intnx() 逐月递增,直到到达最后一个月。 intnx() 也将帮助我们计算开始和结束日期。

%macro get_data(start=, months=12);

    /* Convert start/end values into SAS dates */
    %let start_dt = %sysfunc(inputn(&start., date9.));

    %do i = 0 %to &months.;

        /* Calculate the start and end months for the month of data in the loop */
        %let month_s = %sysfunc(intnx(month, &start_dt., &i., B) );
        %let month_e = %sysfunc(intnx(month, &start_dt., &i., E) );

        %put Pulling data for %cmpres(%sysfunc(putn(&month_s., date9.)) - %sysfunc(putn(&month_e., date9.)));

        /***********************************/
        /***** SQL/DATA Step goes here *****/
        /***********************************/

    %end;
%mend;

%get_data(start=01JAN2018);

在您要添加 SQL 或 DATA 步代码的区域,它可能如下所示:

data want_&month_s.;
    set have;
    where date BETWEEN &month_s. AND &month_e.;
run;

输出:

Pulling data for 01JAN2018 - 31JAN2018
Pulling data for 01FEB2018 - 28FEB2018
Pulling data for 01MAR2018 - 31MAR2018
Pulling data for 01APR2018 - 30APR2018
Pulling data for 01MAY2018 - 31MAY2018
Pulling data for 01JUN2018 - 30JUN2018
Pulling data for 01JUL2018 - 31JUL2018
Pulling data for 01AUG2018 - 31AUG2018
Pulling data for 01SEP2018 - 30SEP2018
Pulling data for 01OCT2018 - 31OCT2018
Pulling data for 01NOV2018 - 30NOV2018
Pulling data for 01DEC2018 - 31DEC2018
Pulling data for 01JAN2019 - 31JAN2019

关于SAS MACRO 到循环月结束日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71210210/

相关文章:

sas - 是否可以循环遍历 SAS 数据集?

macros - 如何使用/执行 "Read command of unix in sas macro"

rest - 如何使用 proc http 和 http_tokenauth 在后台调用 SAS STP

text - SAS:删除一个字符后的所有文本

sas - 列表 SAS 中单词/var 的位置

sas - 将带空格的字符串转换为有效的表名

sas - 如何更简单地转置数据集

sas - VS Code 新文件的默认语言

sql - 在SQL语句中执行宏

sas - "Save As"和 "Close file"不使用宏