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

如何计算两个日期之间的工作日差值 寻求更简便实现方案

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:当天为周三,工作日计数为1
  • 2022-05-29(周日)至 2022-06-02(周四):区间内共5天,扣除1天周末(5月29日周日),工作日计数为4

扩展说明

  • 以上逻辑默认仅排除周六、周日双休,如果需要扣除法定节假日,只需要额外关联节假日维表,统计区间内落在工作日的法定节假日数量做减法即可,依然不需要展开日期序列
  • 如果你的休息规则不是双休(比如单休、大小周),只需要调整DOW值的判断阈值,整体计算框架可以通用
  • 该写法为纯标量计算,没有表展开、关联操作,性能比generate_series()实现的方案高两个数量级以上,也不需要提前创建自定义函数,随查随用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 07:57:27