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

Oracle中获取上月最后一个工作日的方法及特定场景实现

Oracle实现:当月第三个工作日获取上月最后一个工作日

假设我们有一张工作日历表WORKDAY_CALENDAR,包含两个核心字段:

  • CAL_DATE:日期类型,存储具体日期
  • DAY_TYPE:字符类型,'H'代表休息日,'B'代表工作日

实现思路

  1. 先判断目标日期是否为其所在月份的第三个工作日
  2. 若满足条件,查询并返回上一个月份的最后一个工作日

直接查询语句(针对当前系统日期)

SELECT CASE 
         WHEN (SELECT COUNT(*) 
               FROM WORKDAY_CALENDAR 
               WHERE CAL_DATE >= TRUNC(SYSDATE, 'MM') 
                 AND CAL_DATE <= SYSDATE 
                 AND DAY_TYPE = 'B') = 3
         THEN (SELECT MAX(CAL_DATE) 
               FROM WORKDAY_CALENDAR 
               WHERE CAL_DATE < TRUNC(SYSDATE, 'MM') 
                 AND DAY_TYPE = 'B')
         ELSE NULL
       END AS LAST_MONTH_LAST_WORKDAY
FROM DUAL;

针对任意目标日期的查询

将SYSDATE替换为目标日期变量(比如:target_date),即可适配任意日期的判断:

SELECT CASE 
         WHEN (SELECT COUNT(*) 
               FROM WORKDAY_CALENDAR 
               WHERE CAL_DATE >= TRUNC(:target_date, 'MM') 
                 AND CAL_DATE <= :target_date 
                 AND DAY_TYPE = 'B') = 3
         THEN (SELECT MAX(CAL_DATE) 
               FROM WORKDAY_CALENDAR 
               WHERE CAL_DATE < TRUNC(:target_date, 'MM') 
                 AND DAY_TYPE = 'B')
         ELSE NULL
       END AS LAST_MONTH_LAST_WORKDAY
FROM DUAL;

封装为函数(方便重复调用)

如果需要频繁使用该逻辑,可以封装成PL/SQL函数:

CREATE OR REPLACE FUNCTION GET_LAST_MONTH_LAST_WORKDAY(p_target_date DATE) 
RETURN DATE
IS
  v_workday_count NUMBER;
  v_last_workday DATE;
BEGIN
  -- 统计目标日期所在月到目标日期的工作日总数
  SELECT COUNT(*)
  INTO v_workday_count
  FROM WORKDAY_CALENDAR
  WHERE CAL_DATE >= TRUNC(p_target_date, 'MM')
    AND CAL_DATE <= p_target_date
    AND DAY_TYPE = 'B';
  
  IF v_workday_count = 3 THEN
    -- 获取上月最后一个工作日
    SELECT MAX(CAL_DATE)
    INTO v_last_workday
    FROM WORKDAY_CALENDAR
    WHERE CAL_DATE < TRUNC(p_target_date, 'MM')
      AND DAY_TYPE = 'B';
    RETURN v_last_workday;
  ELSE
    RETURN NULL;
  END IF;
END;
/

调用函数示例:

-- 查询2020-02-05对应的上月最后一个工作日
SELECT GET_LAST_MONTH_LAST_WORKDAY(TO_DATE('2020-02-05', 'YYYY-MM-DD')) FROM DUAL;

执行后会返回2020-01-29,符合示例需求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:50:21