首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算工作日PostgresSQL

计算工作日PostgresSQL
EN

Stack Overflow用户
提问于 2020-09-30 06:09:40
回答 1查看 25关注 0票数 0

我正在尝试这样做:

代码语言:javascript
复制
SELECT t.id, t.startdate, t.enddate, FOO
FROM table

其中"Foo“是一些sql mumbo-jumbo,用于计算开始日期和结束日期之间的工作日,如下所示:

代码语言:javascript
复制
+----+------------+------------+--------------+
| 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        | 
+----+------------+------------+--------------+

我可以毫不费力地创建一个函数来这样做:

代码语言:javascript
复制
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;
$$;

有没有什么方法可以让我不用使用这个函数就能做到这一点?

关于奖励积分的奖励问题:

是否可以在实际函数中输入时间戳并将其转换为日期?我只是好奇。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-30 06:12:37

您可以将该函数替换为横向联接:

代码语言:javascript
复制
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()中进行强制转换

代码语言:javascript
复制
from generate_series(t.startdate::date, coalesce(t.enddate::date, current_date), '1 day') x(dt)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64128314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档