Sql 计算Postgres中最近的工作日
我需要在postgres查询中根据订单的请求交货日期安排一些项目。因此,例如,订单要求在周一20120319交付,订单需要在前一个工作日20120316准备 关于最直接方法的思考?我愿意添加日期表。我在想,一定有比一长串案例陈述更好的方法,使用: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
从时间戳“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,而不是更改