Oracle中获取上月最后一个工作日的方法及特定场景实现
Oracle实现:当月第三个工作日获取上月最后一个工作日
假设我们有一张工作日历表WORKDAY_CALENDAR,包含两个核心字段:
CAL_DATE:日期类型,存储具体日期DAY_TYPE:字符类型,'H'代表休息日,'B'代表工作日
实现思路
- 先判断目标日期是否为其所在月份的第三个工作日
- 若满足条件,查询并返回上一个月份的最后一个工作日
直接查询语句(针对当前系统日期)
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
相关产品推荐
相关产品推荐

