如何让SAS中intnx函数的'middle'参数始终返回每月15日
解决SAS中动态获取每月15日的问题
原代码及逻辑
原SAS代码如下:
DATA _NULL_; today = today(); if day(today) ge 1 and day(today) le 15 then do; date2=put(intnx('month',today,-1,'m'), date11.); date1=put(intnx('month',today,-1,'E'), date11.); end; if day(today) > 15 then do; date2=put(intnx('month',today,0,'B'), date11.); date1=put(intnx('month',today,0,'m'), date11.); end; call symput('dt',date1); call symput('dt2',date2); RUN;
代码逻辑:
- 若当日日期的日部分≤15:
date2设为上月中旬、date1设为上月月末 - 若当日日期的日部分>15:
date2设为当月月初、date1设为当月中旬
存在的问题
使用intnx('month', ..., 'm')(middle参数)获取月中旬时,结果不稳定:30天的月份返回15日,31天的月份返回16日,2月情况特殊,无法统一得到每月15日。
尝试直接给intnx结果减1的方案不可行:30天的月份会得到14日,部分场景下还会出现空白日期(显示为点),例如%put &rpt_dt. &rpt_dt2.; . 01-JAN-2023。
解决方案
放弃intnx的'm'参数,改为先获取目标月份的月初日期,再加14天(月初为1日,加14天即为当月15日),无论月份天数多少,都能稳定得到每月15日。
修改后的代码:
DATA _NULL_; today = today(); if day(today) between 1 and 15 then do; /* 上月15日:上月月初+14天 */ date2=put(intnx('month',today,-1,'B') + 14, date11.); date1=put(intnx('month',today,-1,'E'), date11.); end; else do; /* 当月15日:当月月初+14天 */ date2=put(intnx('month',today,0,'B'), date11.); date1=put(intnx('month',today,0,'B') + 14, date11.); end; call symput('dt',date1); call symput('dt2',date2); RUN;
说明
intnx('month', ..., 'B')用于获取目标月份的第一天(月初),加14天后精准得到该月15日,不受月份天数影响- 将原有的两个独立
if语句改为if...else结构,逻辑更简洁清晰 - 用
between 1 and 15替代ge 1 and le 15,提升代码可读性
内容的提问来源于stack exchange,提问作者budding pro
相关产品推荐
相关产品推荐

