Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.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_Sqlite_Datetime - Fatal编程技术网

Sql 查找具有重叠的多行之间的总持续时间(以分钟为单位)

Sql 查找具有重叠的多行之间的总持续时间(以分钟为单位),sql,sqlite,datetime,Sql,Sqlite,Datetime,我有下表: start end ('19:48:43', '21:12:43') ('21:16:36', '21:17:36') ('21:19:22', '21:46:22') ('21:22:41', '22:03:41') ('21:23:29', '22:04:29') 考虑到重叠,我需要知道start和end之间的总时间(以分钟为单位)。根据上表,计算如下: 第1行的间隔不与任何其他行重叠,因此我们计算end-start=84分钟 第2行的间隔不与任何其他行重叠,

我有下表:

start         end
('19:48:43', '21:12:43')
('21:16:36', '21:17:36')
('21:19:22', '21:46:22')
('21:22:41', '22:03:41')
('21:23:29', '22:04:29')
考虑到重叠,我需要知道
start
end
之间的总时间(以分钟为单位)。根据上表,计算如下:

  • 第1行的间隔不与任何其他行重叠,因此我们计算
    end
    -
    start
    =84分钟
  • 第2行的间隔不与任何其他行重叠,因此我们计算
    end
    -
    start
    =1分钟
  • 第3、4、5行的间隔重叠,因此我们计算第5行的
    end
    和第3行的
    start
    之间的差异,即45分钟
总计=84+1+45=130分钟


我正在使用SQLite。到目前为止,我还没有找到任何解决方案。

使用左侧的
将表的两个副本连接到表本身并进行聚合:

WITH cte AS (
  SELECT DISTINCT 
        COALESCE(MIN(ts.start), t.start) start,
        COALESCE(MAX(te.end), t.end) end   
  FROM tablename t
  LEFT JOIN tablename ts ON t.start BETWEEN ts.start AND ts.end
  LEFT JOIN tablename te ON t.end BETWEEN te.start AND te.end
  GROUP BY t.start, t.end
)
SELECT SUM(strftime('%s', end) - strftime('%s', start)) / 60 total 
FROM cte
或更简单:

WITH cte AS (
  SELECT DISTINCT 
        COALESCE(
          (SELECT MIN(t2.start) 
           FROM tablename t2 
           WHERE t1.start BETWEEN t2.start AND t2.end), t1.start) start,
        COALESCE(
          (SELECT MAX(t2.end) 
           FROM tablename t2 
           WHERE t1.end BETWEEN t2.start AND t2.end), t1.start) end   
  FROM tablename t1
)
SELECT SUM(strftime('%s', end) - strftime('%s', start)) / 60 total 
FROM cte
请参阅。
结果:

全部的 130
我看到两个独立且不相关的任务-加入时段并计算总长度。非常感谢!!