You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用SAS宏实现yyyymm格式日期的月份调整及上月获取?

SAS宏实现YYYMM日期增减及上月日期生成

一、单个宏变量的日期增减处理

如果需要对单个yyyymm格式的宏变量进行增减月份操作,可通过%sysfunc调用SAS日期函数实现:

1. 宏变量加1个月

%let current_month = 202212;
/* 生成下月的yyyymm格式日期 */
%let next_month = %sysfunc(intnx(month, %sysfunc(input(&current_month.01, yymmdd8.)), 1, b), yymmddn6.);
%put 原日期:&current_month,下月日期:&next_month;

2. 宏变量减1个月(生成上月)

%let current_month = 202201;
/* 生成上月的yyyymm格式日期 */
%let prev_month = %sysfunc(intnx(month, %sysfunc(input(&current_month.01, yymmdd8.)), -1, b), yymmddn6.);
%put 原日期:&current_month,上月日期:&prev_month;

二、封装宏实现数据集批量生成上月日期

将你原数据步中生成month4的逻辑封装为可复用的宏,用于批量处理数据集:

1. 定义宏

%macro add_prev_month(in_ds=, out_ds=, month_var=, out_var=prev_month);
/* 参数说明:
   in_ds:输入数据集名
   out_ds:输出数据集名
   month_var:输入数据集中yyyymm格式的变量名(字符型)
   out_var:生成的上月日期变量名,默认prev_month
*/
    data &out_ds.;
        set &in_ds.;
        /* 核心逻辑:转换为SAS日期→取上月起始→转成yyyymm格式 */
        &out_var. = put(intnx('month', input(cats(&month_var., '01'), yymmdd8.), -1, b), yymmddn6.);
    run;
%mend add_prev_month;

2. 调用宏处理你的测试数据

/* 原测试数据集 */
data test;
    input month $8.;
    datalines ;
202210
202211
202201
202210
    ;
run;

/* 调用宏生成包含上月日期的数据集 */
%add_prev_month(in_ds=test, out_ds=test2, month_var=month, out_var=month4);

关键逻辑说明

  • 宏中必须通过%sysfunc调用SAS的日期处理函数(input/intnx/put),因为宏语言本身不支持日期运算。
  • intnx函数的第四个参数b指定取月份的起始日期,确保转换后的日期是当月第一天,避免因月末日期导致的格式转换错误。
  • yymmddn6.格式会生成无分隔符的6位字符串,完美匹配yyyymm格式需求。

内容的提问来源于stack exchange,提问作者Mobix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 22:55:48