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

Oracle中如何获取指定月份内排除指定日期的日期列表

获取Oracle指定月份日期列表并排除特定日期

嘿,我来帮你搞定这个需求!要在Oracle里生成指定月份的所有日期,同时排除给定的两个日期,这里有几种实用的实现方式:

方法一:使用递归CTE(清晰易读)

递归CTE的方式逻辑直观,适合理解和维护:

WITH date_range AS (
    -- 生成指定月份的第一天作为起始日期
    SELECT TRUNC(TO_DATE('2012-04', 'YYYY-MM'), 'MM') AS cola
    FROM DUAL
    UNION ALL
    -- 递归生成后续每一天,直到当月最后一天
    SELECT cola + 1
    FROM date_range
    WHERE cola + 1 <= LAST_DAY(TRUNC(TO_DATE('2012-04', 'YYYY-MM'), 'MM'))
)
-- 过滤掉不需要的日期,按顺序输出
SELECT cola
FROM date_range
WHERE cola NOT IN (
    TO_DATE('2012-04-02', 'YYYY-MM-DD'),
    TO_DATE('2012-04-30', 'YYYY-MM-DD')
)
ORDER BY cola;

方法二:使用CONNECT BY(简洁高效)

如果喜欢更简洁的写法,可以用CONNECT BY生成日期序列,再通过MINUS排除指定日期:

-- 生成当月所有日期
SELECT TRUNC(TO_DATE('2012-04', 'YYYY-MM'), 'MM') + LEVEL - 1 AS cola
FROM DUAL
CONNECT BY LEVEL <= LAST_DAY(TRUNC(TO_DATE('2012-04', 'YYYY-MM'), 'MM')) 
                    - TRUNC(TO_DATE('2012-04', 'YYYY-MM'), 'MM') + 1
-- 排除指定的两个日期
MINUS
SELECT TO_DATE('2012-04-02', 'YYYY-MM-DD') FROM DUAL
UNION ALL
SELECT TO_DATE('2012-04-30', 'YYYY-MM-DD') FROM DUAL
-- 按日期排序
ORDER BY cola;

输出成一行字符串(匹配你的示例格式)

如果需要把结果合并成一行,像你示例里**COLA** 2012-04-01 2012-04-03 ...的格式,可以用LISTAGG函数:

WITH date_range AS (
    SELECT TRUNC(TO_DATE('2012-04', 'YYYY-MM'), 'MM') AS cola
    FROM DUAL
    UNION ALL
    SELECT cola + 1
    FROM date_range
    WHERE cola + 1 <= LAST_DAY(TRUNC(TO_DATE('2012-04', 'YYYY-MM'), 'MM'))
)
SELECT '**COLA** ' || LISTAGG(TO_CHAR(cola, 'YYYY-MM-DD'), ' ') WITHIN GROUP (ORDER BY cola) AS result
FROM date_range
WHERE cola NOT IN (
    TO_DATE('2012-04-02', 'YYYY-MM-DD'),
    TO_DATE('2012-04-30', 'YYYY-MM-DD')
);

小提示

  • 你可以把'2012-04'、'2012-04-02'这些硬编码的值换成变量,方便复用
  • TRUNC(..., 'MM')用来获取当月第一天,LAST_DAY()用来获取当月最后一天,这两个函数是Oracle处理月份日期的常用工具

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:05:33