You need to enable JavaScript to run this app. SAS代码问询:含today()函数的日期计算代码是否无实际作用?
优惠活动
大模型
产品
解决方案
定价
更多

SAS代码问询:含today()函数的日期计算代码是否无实际作用?

核心误解纠正

你对today()函数的基础理解没错,它确实返回1960年1月1日到当前日期的天数,但你看错了判断条件的取值:代码里的判断是day(today()) >= 8,day()是SAS的日期取值函数,作用是从SAS日期值中提取当月的日序号,返回值范围是1~31,不是直接拿today()的返回值和8比较。
因此day(today()) < 8的条件每月1-7号都会触发,这段代码完全是有实际作用的,不是无用代码。

代码功能说明

这段代码是用来计算业务常用的截止日期enddate,完整逻辑如下:

  • 每月8号及之后运行代码时,enddate取当前日期往前推3天的日期
  • 每月1-7号运行代码时,enddate取上个月的最后一天:
    • 若当前不是1月,自动判断上个月是大小月、是否为闰年2月,返回对应月份的最后一天
    • 若当前是1月,直接返回上一年的12月31日

你贴的完整SAS代码格式化后如下:

data Dates;
    rundate=mdy(1,1,year(today()));

    if day(today()) >= 8 then do;
        enddate=today()-3;
    end;
    else do;
        if month(today()) ~= 1 then do;
            if (month(today())-1) in (1,3,5,7,8,10,12) then do;
                enddate=mdy(month(today())-1,31,year(today()));
            end;
            else if (month(today())-1) in (4,6,9,11) then do;
                enddate=mdy(month(today())-1,30,year(today()));
            end;
            else do;
                if year(today()) not in (2020,2024,2028,2032) then enddate=mdy(2,28,year(today()));
                else enddate=mdy(2,29,year(today()));
            end;
        end;

        else do;
            enddate=mdy(12,31,year(today())-1);
        end;
    end;
run;

可选优化方案

原有代码里手动判断大小月、闰年的逻辑可以用SAS内置日期函数直接简化,intnx('month', today(), -1, 'e')可以直接返回上个月最后一天的SAS日期值,不需要自行写分支判断,改写后代码会精简很多,且覆盖所有闰年场景,不需要硬编码2020/2024等闰年年份。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 22:24:03