如何从日期段获取特定的工作日?

时间:2019-09-25 13:19:14

标签: sql postgresql

我试图获取一个月或不同时间段内特定工作日的计数。

在我的例程中,我有startDate和endDate,它们指示我要查找工作日的时间段的开始和结束。

我知道如何获取从开始到结束日期的天数。

select
   date_part('day',age('2010-04-10', '2010-04-05'));

给我输出:5

这给了我一天的名字:

to_char(current_date, 'day')

例如:“星期一”。

我有一个名为RecurrentWeekDay的变量(具有“ monday”,“ tuesday”等值。),我想检查是否存在与RecurrentWeekDay名称匹配的weekDay(例如,如果RecurrentWeekDay为“ monday”,则需要检查startDate和EndDate之间是否有星期一)。

1 个答案:

答案 0 :(得分:2)

demo:db<>fiddle

您可以使用generate_series()生成两个边界之间的所有日期。之后,您可以使用to_char()来获取他们的工作日。使用IN比较器,您将获得预期的结果:

SELECT
    id,
    'Monday' IN (
         SELECT to_char(generate_series(start_date, end_date, interval '1 day'), 'FMDay')
    )
FROM
    mydates

因为始终包含星期几,所以如果日期差等于或大于6,则可以优化以仅计算小于6的日期序列:

SELECT
    id,
    CASE WHEN end_date - start_date >= 6 THEN true
        ELSE 'Monday' IN (
            SELECT 
                 to_char(
                      generate_series(start_date, end_date, interval '1 day'), 
                      'FMDay'
                 )
        )
    END AS is_in
FROM
    mydates