首页 > 解决方案 > PostgreSQL 中截至当前日期的每月工作日

问题描述

我想在 PostgreSQL 中随着时间的推移获取当月的工作日数,直到当前日期。

比如这个月到今天,工作日是17天,怎么从下面的查询或者一般的解决方案中得到呢?

SELECT 
    TO_CHAR(i, 'YYYY-MM') as year_month,
    i::date as date,
    EXTRACT(DOW FROM i) as number_weekday,
    CASE WHEN EXTRACT(DOW FROM i) IN ('1', '2', '3', '4', '5') 
                  AND i NOT IN ('2018-01-01', '2018-03-30', '2018-04-02', '2018-05-01', '2018-05-10', '2018-05-21', '2018-10-03', '2018-12-25', '2018-12-26',
                                    '2019-01-01', '2019-04-19', '2019-04-22', '2019-05-01', '2019-05-30', '2019-06-10', '2019-10-03', '2019-12-25', '2019-12-26',
                                    '2020-01-01', '2020-04-10', '2020-04-13', '2020-05-01', '2020-05-21', '2020-06-01', '2020-10-03', '2020-12-25', '2020-12-26',
                                    '2021-01-01', '2021-04-02', '2021-04-05', '2021-05-01', '2021-05-13', '2021-05-24', '2021-10-03', '2021-12-25', '2021-12-26')
              THEN 'Working Day' ELSE 'Non Working Day' END as day_type

    FROM 
        generate_series('2017-12-31', '2022-01-01', '1 day'::interval) i
   WHERE 
    i::date < CURRENT_DATE
    ORDER BY 
        date DESC

标签: sqlpostgresqldatedatetimerecursive-query

解决方案


我想获取当前日期之前的一个月的工作日数

只是:

select sum( (extract(dow from d) between 1 and 5)::int ) month_working_days_till_date
from generate_series(date_trunc('month', now()) , now(), interval '1 day') x(d)

generate_seires()生成从月初到今天的一系列日期。然后我们做一个sum()只计算工作日的条件。请注意,这没有考虑潜在的假期(为此,您需要一个日历表)。

DB Fiddle 上的演示

| month_working_days_till_date |
| ---------------------------: |
| 17 |

推荐阅读