如何计算两个日期之间的工作日差值 寻求更简便实现方案
PostgreSQL 两日期区间工作日天数简便计算方案
不用自定义函数、不用generate_series()逐行展开日期,直接通过日期数学运算就能计算,性能远高于序列展开方案,千万级数据量也能快速出结果。
核心计算逻辑
- 先算区间总天数(首尾包含的话为
end_date - start_date + 1,不包含结束日就去掉+1) - 减去区间内完整周包含的固定周末天数
- 再减去区间首尾零散天数中落在周六、周日的天数,用
EXTRACT(DOW FROM 日期)判断星期:返回值0为周日,1-5为周一到周五工作日,6为周六
可直接套用的SQL代码
对应给出的测试表结构,替换表名即可直接运行:
SELECT start_date, end_date, ( (end_date - start_date + 1) - (EXTRACT(DOW FROM end_date) - EXTRACT(DOW FROM start_date) BETWEEN -6 AND 0)::int * 2 - LEAST(EXTRACT(DOW FROM start_date), 6) - GREATEST(EXTRACT(DOW FROM end_date), 1) + 5 )::int AS workday_count FROM 你的业务表名;
示例数据计算结果验证
对给出的两行测试数据,计算结果如下:
2022-06-01至2022-06-01:当天为周三,工作日计数为12022-05-29(周日)至2022-06-02(周四):区间内共5天,扣除1天周末(5月29日周日),工作日计数为4
扩展说明
- 以上逻辑默认仅排除周六、周日双休,如果需要扣除法定节假日,只需要额外关联节假日维表,统计区间内落在工作日的法定节假日数量做减法即可,依然不需要展开日期序列
- 如果你的休息规则不是双休(比如单休、大小周),只需要调整DOW值的判断阈值,整体计算框架可以通用
- 该写法为纯标量计算,没有表展开、关联操作,性能比
generate_series()实现的方案高两个数量级以上,也不需要提前创建自定义函数,随查随用
内容的提问来源于stack exchange,提问作者ltx
相关产品推荐
相关产品推荐

