Sql 如何查询未涵盖的时间
我有一张这样的“会话”表:Sql 如何查询未涵盖的时间,sql,postgresql,Sql,Postgresql,我有一张这样的“会话”表: id | start | end 1 | "2018-05-17 07:51:38.392"| "2018-05-17 08:51:38.392" 2 | "2018-05-17 09:51:38.392"| "2018-05-17 10:51:38.392" 3 | "2018-05-17 17:51:38.392"| "2018-05-17 18:51:38.392" 4 | "2018-05-18 07:51:38.
id | start | end
1 | "2018-05-17 07:51:38.392"| "2018-05-17 08:51:38.392"
2 | "2018-05-17 09:51:38.392"| "2018-05-17 10:51:38.392"
3 | "2018-05-17 17:51:38.392"| "2018-05-17 18:51:38.392"
4 | "2018-05-18 07:51:38.392"| "2018-05-18 17:51:38.392"
现在我想查询时间戳的实际日期内的时间(总和)(日期从min开始(开始和结束于max结束)),其中时间不在会话范围内
因此,2018-05-2017年的结果将是
11小时总计-3小时覆盖=8小时空闲
总计
是最大值(结束时间)-最小值(开始时间)和覆盖
是总和(结束时间-开始时间):
如果每节课只有一天,我想你可以做一些像24小时总和(结束-开始)?样本数据和期望的结果会很有帮助。
with my_table(id, start_t, end_t) as (
values
(1, '2018-05-17 07:51:38.392'::timestamp, '2018-05-17 08:51:38.392'::timestamp),
(2, '2018-05-17 09:51:38.392', '2018-05-17 10:51:38.392'),
(3, '2018-05-17 17:51:38.392', '2018-05-17 18:51:38.392'),
(4, '2018-05-18 07:51:38.392', '2018-05-18 17:51:38.392')
)
select
start_t::date as day,
max(end_t) - min(start_t) as total,
sum(end_t - start_t) as covered,
max(end_t) - min(start_t) - sum(end_t - start_t) as idle
from my_table
group by 1
order by 1
day | total | covered | idle
------------+----------+----------+----------
2018-05-17 | 11:00:00 | 03:00:00 | 08:00:00
2018-05-18 | 10:00:00 | 10:00:00 | 00:00:00
(2 rows)