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;
逻辑说明
- 明确时间范围:通过
cte_time统一定义起始时间(date_create)和结束时间(固定为2023-02-28 23:59:59),简化后续计算。 - 统计工作日数量:利用
generate_series生成两个日期之间的所有日期,筛选出周一至周五(EXTRACT(DOW FROM dt)返回1代表周一,5代表周五),统计工作日总数。 - 计算工作日间隔:用原始时间间隔减去非工作日的总时长(非工作日天数×1天),最终得到包含天、时、分、秒的纯工作日时间间隔。
结果说明
针对你的测试数据,正确的工作日间隔应为9 days 11:14:49——2023年2月15日至2月28日之间实际有10个工作日,原始总间隔为13天11小时14分49秒,减去4天非工作日后得到该结果。若你预期的11天是特殊计算规则(如强制将起始/结束当天计为完整工作日),可调整work_days的统计逻辑。
内容的提问来源于stack exchange,提问作者executable
相关产品推荐
相关产品推荐

