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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 11:28:06