如何解决如何使用date_part选项在postgres中获得不同的日期
如何在PostgreSQL中获取日期时间差
我正在使用以下语法
select id,A_column,B_column,(SELECT count(*) AS count_days_no_weekend
FROM generate_series(B_column ::timestamp,A_column ::timestamp,interval '1 day') the_day
WHERE extract('ISODOW' FROM the_day) < 5) * 24 + DATE_PART('hour',B_column::timestamp-A_column ::timestamp ) as hrs
FROM table req where id='123';
如果A_column = 2020-05-20 00:00:00和B_column = 2020-05-15 00:00:00我想得到72(以小时为单位)。
是否有可能在第一个周末跳过周末(星期六和星期日),这意味着将结果设为72小时(不包括周末时间)
我得到0
但是我需要72小时
如果A_column = 2020-08-15 12:00:00和B_column = 2020-08-15 00:00:00如果我想获得12(以小时为单位)。
解决方法
一个选项使用横向联接和generate_series()
来枚举两个时间戳之间的每个小时,同时过滤掉周末:
select t.a_column,t.b_column,h.count_hours_no_weekend
from mytable t
cross join lateral (
select count(*) count_hours_no_weekend
from generate_series(t.b_column::timestamp,t.a_column::timestamp,interval '1 hour') s(col)
where extract('isodow' from s.col) < 5
) h
where id = 123
,
我会通过计算周末时间来解决这个问题,让数据库处理夏时制。然后,我将从两个日期值之间的差值中减去干预的周末时间。
with weekend_days as (
select *,date_part('isodow',ddate) as dow
from table1
cross join lateral
generate_series(
date_trunc('day',b_column),date_trunc('day',a_column),interval '1 day') as gs(ddate)
where date_part('isodow',ddate) in (6,7)
),weekend_time as (
select id,sum(
least(ddate + interval '1 day',a_column) -
greatest(ddate,b_column)
) as we_ival
from weekend_days
group by id
)
select t.id,a_column - b_column as raw_difference,coalesce(we_ival,interval '0') as adjustment,a_column - b_column -
coalesce(we_ival,interval '0') as adj_difference
from weekend_time w
left join table1 t on t.id = w.id;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。