基于日历表的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
相关产品推荐
相关产品推荐

