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

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

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

  1. ordered_timestamp | weekday_hours | due_timestamp
  2. 2020-06-04 16:00:00 | 12 | 2020-06-05 04:00:00
  3. 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() ,然后只计算属于工作日的天数:

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

db小提琴演示:

  1. ordered_timestamp | due_timestamp | weekday_hours
  2. :------------------ | :------------------ | ------------:
  3. 2020-06-04 16:00:00 | 2020-06-05 04:00:00 | 12
  4. 2020-06-05 16:00:00 | 2020-06-09 16:00:00 | 48
ujv3wf0j

ujv3wf0j2#

像这样的?

  1. case when (EXTRACT(DOW FROM ordered_timestamp ) = 6 )
  2. then ordered_timestamp + interval '1 hour' * (weekday_hours+48)
  3. when (EXTRACT(DOW FROM ordered_timestamp ) = 0 )
  4. then ordered_timestamp + interval '1 hour' * (weekday_hours+24)
  5. else
  6. ordered_timestamp + interval '1 hour' * weekday_hours
  7. end

相关问题