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
相关产品推荐
相关产品推荐

