gpt4 book ai didi

sql - 如何根据 PL/pgSQL 中的开始日期和持续时间(工作日)获取结束日期?

转载 作者:行者123 更新时间:2023-11-29 12:43:08 27 4
gpt4 key购买 nike

我需要根据开始日期和持续时间(代表工作日数的整数)计算工作的结束日期。

我已经写了一个函数,基于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 中找到另一个很好的例子,混合了周末和假期。

最佳答案

CREATE OR REPLACE FUNCTION is_business_day(p_date date)
RETURNS boolean AS
$BODY$
DECLARE
is_business_day boolean;
dow int;
BEGIN
dow := extract('dow' from p_date);

IF dow = 6 OR dow = 0
THEN
is_business_day := FALSE;
ELSE
is_business_day := TRUE;
END IF;

RETURN is_business_day ;
END;
$BODY$
LANGUAGE plpgsql IMMUTABLE;



CREATE OR REPLACE FUNCTION working_date(date start_date, int duration)
RETURNS date AS
$BODY$
DECLARE
ret_date date;
loop_date date;
BEGIN
--add days
ret_date := start_date + (duration - 1);

loop_date := start_date + 1;
--add extra day for each no business day between start_date and ret_date
WHILE loop_date <= ret_date LOOP
IF not is_business_day(loop_date) THEN
ret_date := ret_date + 1;
END IF;
loop_date := loop_date + 1;
END LOOP;
--add day if ret_date is no business day
WHILE not is_business_day(ret_date) LOOP
ret_date := ret_date + 1;
END LOOP;

RETURN ret_date;
END;
$BODY$
LANGUAGE plpgsql VOLATILE SECURITY DEFINER
COST 100;

关于sql - 如何根据 PL/pgSQL 中的开始日期和持续时间(工作日)获取结束日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39094949/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com