如何在postgres的时间戳中添加间隔时间,不包括周末时间

2g32fytz  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(361)

我在postgres有一个表,有两列;订购时间戳,工作日时间。
我想创建第三列'due\u timestamp',它是使用'ordered\u timestamp'加上'weekday\u hours'来计算的……但不包括周末的时间(星期六上午12:00到星期一上午12:00)

ordered_timestamp    | weekday_hours  | due_timestamp
2020-06-04 16:00:00  |             12 | 2020-06-05 04:00:00
2020-06-05 16:00:00  |             48 | 2020-06-09 16:00:00

如果没有排除周末时间的警告,我可以 ordered_timestamp + interval '1 hour' * weekday_hours 在某些情况下,工作日的工作时间从1小时到数百小时不等。
看来这种情况需要一些额外的东西来过滤掉周末的时间。

shyt4zoc

shyt4zoc1#

如果您的日期间隔可能跨越不同的时期,我会使用一个相当暴力的方法,通过列举所有1小时间隔之间的时间戳与 generate_series() ,然后只计算属于工作日的天数:

select t.ordered_timestamp, t.due_timestamp, x.weekday_hours
from mytable t
cross join lateral (
    select count(*) filter(where extract(dow from ts) between 1 and 5) - 1 weekday_hours 
    from generate_series(ordered_timestamp, due_timestamp, '1 hour'::interval) s(ts)
) x

db小提琴演示:

ordered_timestamp   | due_timestamp       | weekday_hours
:------------------ | :------------------ | ------------:
2020-06-04 16:00:00 | 2020-06-05 04:00:00 |            12
2020-06-05 16:00:00 | 2020-06-09 16:00:00 |            48
ujv3wf0j

ujv3wf0j2#

像这样的?

case when  (EXTRACT(DOW FROM  ordered_timestamp ) = 6  )
     then  ordered_timestamp + interval '1 hour' * (weekday_hours+48)
     when  (EXTRACT(DOW FROM  ordered_timestamp ) = 0  )
     then  ordered_timestamp + interval '1 hour' * (weekday_hours+24)
 else
     ordered_timestamp + interval '1 hour' * weekday_hours
 end

相关问题