【发布时间】:2016-08-23 07:30:10
【问题描述】:
我需要根据开始日期和持续时间(代表工作日数的整数)计算工作的结束日期。
我已经编写了一个基于this answer 的函数,它计算两个日期(开始和虚拟结束)之间的周末天数。
-- 0 Sunday
-- 1 Monday
-- 2 Tuesday
-- 3 Wednesday
-- 4 Thursday
-- 5 Friday
-- 6 Saturday
CREATE OR REPLACE FUNCTION weekend_days(date, date) RETURNS INT AS
$$
SELECT COUNT(days)::INT
FROM generate_series($1, $2, '1 day') AS days
WHERE EXTRACT(DOW FROM days) BETWEEN 1 AND 5;
$$
LANGUAGE 'sql' IMMUTABLE STRICT;
我想创建一个触发器 ON INSERT 或 ON UPDATE 来填充相应的 end_date 列。
显然,将周末天数添加到给定的持续时间并不能解决问题。
递归
有什么方法可以让递归函数继续添加周末或节假日?
编辑:也许可以在this answer 中找到另一个很好的例子,它混合了周末和节假日。
【问题讨论】:
-
使用日历表。您可能也关心假期,日历表是最安全的方法。
-
你能提供任何真实的例子吗?目前,我需要一个意大利语节假日日历。
-
您需要自己创建。使用
generate_series生成日期。标记那些是假期等:) -
最后我构建了一个帮助表来跳过假期,使用
generate_series和Meeus/Jones/Butcher 算法来计算未来几年的复活节星期日。 gist.github.com/sentenza/e8f8003e2581d52f12f8c89d663c00d7
标签: sql postgresql plpgsql postgresql-9.4