Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何查询未涵盖的时间_Sql_Postgresql - Fatal编程技术网

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)