Sql 计算Postgres中最近的工作日

Sql 计算Postgres中最近的工作日,sql,postgresql,date,Sql,Postgresql,Date,我需要在postgres查询中根据订单的请求交货日期安排一些项目。因此,例如,订单要求在周一20120319交付,订单需要在前一个工作日20120316准备 关于最直接方法的思考?我愿意添加日期表。我在想,一定有比一长串案例陈述更好的方法,使用: 从时间戳“2001-02-16 20:38:40”中选择EXTRACTDOW 前一个工作日: select max(s.a) as work_day from ( select s.a::date from generate_serie

我需要在postgres查询中根据订单的请求交货日期安排一些项目。因此,例如,订单要求在周一20120319交付,订单需要在前一个工作日20120316准备

关于最直接方法的思考?我愿意添加日期表。我在想,一定有比一长串案例陈述更好的方法,使用:
从时间戳“2001-02-16 20:38:40”中选择EXTRACTDOW

前一个工作日:

select max(s.a) as work_day
from (
    select s.a::date
    from generate_series('2012-01-02'::date, '2050-12-31', '1 day') s(a)
    where extract(dow from s.a) between 1 and 5
    except
    select holiday_date
    from holiday_table
    ) s
where s.a < '2012-03-19'
;
如果你想在下一个工作日进行查询,只需反转查询即可

CREATE TABLE Holidays (Holiday, PrecedingBusinessDay) AS VALUES
  ('2012-12-25'::DATE, '2012-12-24'::DATE),
  ('2012-12-26'::DATE, '2012-12-24'::DATE);
SELECT Day, COALESCE(PrecedingBusinessDay, PrecedingMondayToFriday)
FROM
  (SELECT Day, Day - CASE DATE_PART('DOW', Day)
                         WHEN 0 THEN 2
                         WHEN 1 THEN 3
                         ELSE 1
                     END AS PrecedingMondayToFriday
   FROM TestDays) AS PrecedingMondaysToFridays
LEFT JOIN Holidays ON PrecedingMondayToFriday = Holiday;
您可能需要重命名某些标识符:-

SELECT y.d AS prep_day
FROM  (
    SELECT generate_series(dday - 8, dday - 1, interval '1d')::date AS d
    FROM (SELECT '2012-03-19'::date AS dday) x
    ) y
LEFT   JOIN holiday h USING (d)
WHERE  h.d IS NULL
AND    extract(isodow from y.d) < 6
ORDER  BY y.d DESC
LIMIT  1;
它应该更快地生成所需的天数。我在交付前一周生成。这应该涵盖所有可能性

对于工作日的测试比道指更方便

min/max,orderby/LIMIT 1,这是我查询中的几行的品味问题

要按降序获得多个候选天数,而不仅仅是排名靠前的天数,请将限制更改为1

我将dday交货日期放在子查询中,因此您只需输入一次。您可以输入任何日期或时间戳文字。无论哪种方式,它都是迄今为止铸造的


这是你的前一个工作日

SELECT 
    CASE (EXTRACT(ISODOW FROM current_date)::integer) % 7
        WHEN 1 THEN current_date-3
        WHEN 0 THEN current_date-2
        ELSE current_date-1
    END AS previous_business_day

如果星期五是假日呢?工作很有魅力。谢谢为了向其他人澄清一件事,当Clodoaldo说反转查询时,将其更改为选择mins.a,而不是更改。我将以稍微不同的方式处理假日。我假设要使用上面的解决方案,你必须将它们存储在某个地方。但对我们来说,它们的出现频率还不够高,我们只需要重新安排订单。@Dustin,反过来说,你应该同时做min和>,我错过了博士后的假期表吗?