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

基于日历表的Impala/Oracle SQL工作日计算技术问询

使用日历表实现工作日计算(Impala/Oracle SQL)

基于你提供的日历表(含ref_date、civil_util等字段),以下是高效实现两类计算的SQL方案:

1. 给定日期加减N个工作日

通过窗口函数对所有工作日进行连续编号,再通过编号偏移获取目标日期,支持正负N(正为往后推,负为往前算)。

WITH workday_sequence AS (
    SELECT 
        ref_date,
        -- 按日期顺序累计工作日数量,生成连续序列
        SUM(CASE WHEN civil_util = '1' THEN 1 ELSE 0 END) OVER (ORDER BY ref_date) AS workday_num
    FROM calendar_table
)
SELECT target.ref_date AS result_date
FROM workday_sequence input
JOIN workday_sequence target 
    ON target.workday_num = input.workday_num + :p_n
WHERE input.ref_date = :p_input_date;

说明:

  • :p_input_date为输入的基准日期,:p_n为要加减的工作日数(如+1表示往后1个工作日,-2表示往前2个工作日)
  • 示例场景:输入p_input_date='2022-11-30'、p_n=1,将返回2022-12-02
  • 建议给calendar_table的ref_date和civil_util字段建立索引,提升大表查询效率

2. 获取给定日期的上月最后一个工作日

直接筛选上月所有工作日并取最大值,是最直接高效的方式:

SELECT MAX(ref_date) AS last_workday_prev_month
FROM calendar_table
WHERE 
    -- 限定日期在上月范围内
    ref_date >= ADD_MONTHS(TRUNC(:p_input_date, 'MONTH'), -1)
    AND ref_date < TRUNC(:p_input_date, 'MONTH')
    -- 仅统计工作日
    AND civil_util = '1';

说明:

  • TRUNC(:p_input_date, 'MONTH')获取输入日期当月第一天,ADD_MONTHS(..., -1)得到上月第一天
  • 示例场景:输入p_input_date='2022-11-30',将返回2022-10-31
  • 若日历表已预计算prev_wkday字段,也可从上月最后一天往前追溯,但直接取最大值的性能更优

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:35:33