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

如何在Oracle SQL中生成过去13个月的每月月末日期列表?

如何用Oracle SQL生成过去13个月的每月月末日期列表?

嘿,这个需求用Oracle自带的日期函数就能完美解决,我给你两种实用的实现方式,按需选择就行:

方法一:基于当前日期动态生成(最常用)

这种方式会以系统当前日期为基准,自动生成过去13个月的月末日期,完全不用手动指定起始时间,非常灵活。

SELECT TO_CHAR(LAST_DAY(ADD_MONTHS(SYSDATE, -LEVEL + 1)), 'MM-DD-RR') AS month_end_date
FROM DUAL
CONNECT BY LEVEL <= 13
ORDER BY month_end_date ASC;

代码解释:

  • SYSDATE:Oracle的系统当前日期,作为基准日期
  • ADD_MONTHS(SYSDATE, -LEVEL + 1):当LEVEL为1时,取当前月份;LEVEL为13时,取12个月前的月份,以此覆盖13个连续月份
  • LAST_DAY():核心函数,自动返回指定月份的最后一天,会智能处理闰年2月、30天/31天的月份,不用你手动判断
  • TO_CHAR(..., 'MM-DD-RR'):把日期格式转换成你需要的2-28-17样式,RR会自动将四位年份简化为两位(比如2017显示为17)
  • CONNECT BY LEVEL <=13:生成1到13的序列,用来对应13个月份的循环
  • ORDER BY month_end_date ASC:让结果按时间从早到晚排序,如果你需要从近到远,换成DESC即可

方法二:指定固定起始月份生成

如果你的需求是固定某一段范围(比如示例里的2017年2月到2018年2月),可以直接指定起始日期来生成:

SELECT TO_CHAR(LAST_DAY(ADD_MONTHS(TO_DATE('2-28-17', 'MM-DD-RR'), LEVEL - 1)), 'MM-DD-RR') AS month_end_date
FROM DUAL
CONNECT BY LEVEL <= 13
ORDER BY month_end_date ASC;

代码解释:

  • TO_DATE('2-28-17', 'MM-DD-RR'):手动指定起始日期为2017年2月28日
  • ADD_MONTHS(..., LEVEL -1):从起始月份开始,依次往后加0到12个月,刚好覆盖13个连续月份
  • 其他函数的作用和方法一完全一致,同样能自动处理各种月末的特殊情况

额外小贴士:

  • 如果你需要四位年份的格式(比如02-28-2017),只需要把格式字符串里的RR改成YYYY就行
  • 不用担心闰年或者不同月份天数的问题,LAST_DAY()已经帮你处理好了所有边界情况
  • 如果你的Oracle版本支持WITH子句,也可以用递归CTE来实现,逻辑和上面的方法类似,不过CONNECT BY的写法更简洁

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:54:25