问题描述
我正在尝试做这样的事情:
SELECT t.id,t.startdate,t.enddate,FOO
FROM table
其中“ Foo”是一些sql Mumbo-jumbo,用于计算开始日期和结束日期之间的工作日,例如:
+----+------------+------------+--------------+
| id | startdate | enddate | businessdays |
+----+------------+------------+--------------+
| 1 | 2020-09-12 | 2020-09-28 | 11 |
| 2 | 2020-09-02 | 2020-09-28 | 19 |
| 3 | 2020-09-22 | 2020-09-28 | 5 |
+----+------------+------------+--------------+
CREATE OR REPLACE FUNCTION getbusinessday(startdate date,enddate date DEFAULT current_date) RETURNS int
LANGUAGE plpgsql
AS
$$
DECLARE
daycount integer;
BEGIN
SELECT COUNT(i)
INTO daycount
FROM generate_series(startdate,enddate,'1 day') i
WHERE EXTRACT(DOW FROM i) NOT IN (0,6);
RETURN daycount;
END;
$$;
无论如何,无需使用此功能就可以实现这一目标吗?
奖励积分奖励问题:
是否可以允许输入时间戳,并将其转换为实际功能中的日期?我很好奇。
解决方法
您可以将函数替换为横向联接:
select t.*,x.*
from mytable t
cross join lateral (
select count(*) businessdays
from generate_series(t.startdate,coalesce(t.enddate,current_date),'1 day') x(dt)
where extract (dow from x.dt) not in (0,6)
) x
我不确定您关于时间戳/日期转换的问题。如果您的栏目包含时间成分,并且不想将其考虑在内,则可以强制转换generate_series()
:
from generate_series(t.startdate::date,coalesce(t.enddate::date,'1 day') x(dt)