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

PostgreSQL中如何计算含天时分秒的两个Datetime工作日间隔

PostgreSQL计算两个Datetime的工作日时间间隔(含天/时/分/秒)

你的原查询未区分工作日与非工作日,仅简单剔除了总天数间隔,因此无法得到正确的工作日天数统计。以下是适配只读数据库的解决方案:

正确查询语句

WITH cte_time AS (
    SELECT
        id,
        date_create,
        '2023-02-28 23:59:59'::timestamp AS end_ts,
        date_create::timestamp AS start_ts
    FROM req
    WHERE date_create::timestamp <= '2023-02-28 23:59:59'::timestamp
),
business_days AS (
    SELECT
        id,
        date_create,
        start_ts,
        end_ts,
        -- 统计起始到结束日期之间的工作日总数(周一至周五)
        (SELECT COUNT(*)
         FROM generate_series(date_trunc('day', start_ts), date_trunc('day', end_ts), INTERVAL '1 day') AS dt
         WHERE EXTRACT(DOW FROM dt) BETWEEN 1 AND 5) AS work_days,
        -- 计算原始时间间隔
        end_ts - start_ts AS total_interval
    FROM cte_time
)
SELECT
    id,
    date_create,
    -- 减去非工作日的时间,得到纯工作日间隔
    total_interval - (
        (DATE_PART('day', date_trunc('day', end_ts) - date_trunc('day', start_ts)) + 1 - work_days) * INTERVAL '1 day'
    ) AS interval_business
FROM business_days;

逻辑说明

  1. 明确时间范围:通过cte_time统一定义起始时间(date_create)和结束时间(固定为2023-02-28 23:59:59),简化后续计算。
  2. 统计工作日数量:利用generate_series生成两个日期之间的所有日期,筛选出周一至周五(EXTRACT(DOW FROM dt)返回1代表周一,5代表周五),统计工作日总数。
  3. 计算工作日间隔:用原始时间间隔减去非工作日的总时长(非工作日天数×1天),最终得到包含天、时、分、秒的纯工作日时间间隔。

结果说明

针对你的测试数据,正确的工作日间隔应为9 days 11:14:49——2023年2月15日至2月28日之间实际有10个工作日,原始总间隔为13天11小时14分49秒,减去4天非工作日后得到该结果。若你预期的11天是特殊计算规则(如强制将起始/结束当天计为完整工作日),可调整work_days的统计逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 07:30:00