计算工作日PostgresSQL

问题描述

我正在尝试做这样的事情:

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)