如何编写SAS宏批量生成1-30个月对应yyyymmdd格式的日期宏变量
SAS批量生成月度月末日期宏变量解决方案
原有代码存在以下问题:
- 宏变量名拼接逻辑错误:
call symput第一个参数使用单引号会阻止宏变量解析,且引号未正确闭合,无法生成带后缀的动态宏变量名 - 语法缺漏:
intnx函数的时间参数'month'缺少右引号,call symput语句缺少右括号,无run语句闭合数据步 - 格式名错误:SAS中输出yyyymmdd格式的纯数字日期格式为
yymmddn8.,不存在yyyymmddn.格式
方案1:传入单个参数生成对应单条宏变量
每次传入1个1-30区间的&macvar值,生成对应宏变量的正确代码如下:
%let macvar = 1; /* 可替换为1-30区间的任意数值 */ data _null_; call symput("as_of_date_nbr&macvar", put(intnx('month', today(), -&macvar, 'E'), yymmddn8.)); run; /* 验证生成结果 */ %put &as_of_date_nbr&macvar;
方案2:宏循环批量生成1-30个宏变量
无需逐个传参,一次性批量生成30个对应宏变量的实现代码:
%macro gen_as_of_dates(max_n=30); %do i = 1 %to &max_n; data _null_; call symput("as_of_date_nbr&i", put(intnx('month', today(), -&i, 'E'), yymmddn8.)); run; %end; %mend gen_as_of_dates; /* 调用宏批量生成1-30对应的宏变量 */ %gen_as_of_dates(max_n=30); /* 验证示例 */ %put &as_of_date_nbr1; /* 输出上月月末日期 */ %put &as_of_date_nbr2; /* 输出上上月月末日期 */
以上两种方案生成的宏变量均与原有调用逻辑兼容,可直接用于where date = &as_of_date_nbrX的过滤场景,无需调整原有下游调用代码。
内容的提问来源于stack exchange,提问作者Coop
相关产品推荐
相关产品推荐

