sql - 在同一列上迭代时计算持续时间

标签 sql postgresql date group-by

是否可以根据同一列中存在的时间之间的差异来计算每日总小时数?

<表类=“s-表”> <标题> 日期 时间 <正文> 2017-11-08 08:25:57 2017-11-08 12:31:59 2017-11-08 13:28:42 2017-11-08 17:34:13 2017-11-09 08:28:08 2017-11-09 12:31:15 2017-11-09 13:20:13

我可以使用此查询获取 enditime 和 starttime 的单独数据:

SELECT MAX(time) AS "endtime",
       MIN(time) AS "startime",
       MAX(time)-MIN(time) as "totalneedtocalculatepause"
WHERE (date = '2017-11-08'::date )
FROM history ts

但是缺少 startpause 和 endpause:

<表类=“s-表”> <标题> 结束时间 开始时间 总需要计算暂停 <正文> 17:34:13 08:25:57 09:08:16

正确的顺序应该是:

day         startpause   starttime    endtime     endpause
2017-11-08: (12:31:59 - 08:25:57) + (17:34:13 - 13:28:42)

我使用的是 PostgreSQL 13。

最佳答案

鉴于您的记录是耦合的并且连续值代表开始结束时间段,您可以使用 ROW_NUMBER函数,除以 2,并取上限,以识别对(分区)。然后使用您的查询,同时对新生成的列进行分区。

WITH cte AS (
    SELECT *, CEIL((ROW_NUMBER() OVER(PARTITION BY date ORDER BY time)+1)/2) AS rn 
    FROM history
)
SELECT MAX(time) AS "endtime",
       MIN(time) AS "startime",
       CAST(MAX(time)-MIN(time) AS time) AS "totalneedtocalculatepause"
FROM cte
WHERE (date = '2017-11-08'::date)
GROUP BY rn

输出”:

<表类=“s-表”> <标题> 结束时间 开始时间 总需要计算暂停 <正文> 12:31:59 08:25:57 04:06:02 17:34:13 13:28:42 04:05:31

查看演示 here .


如果您想要整体摘要,您可以应用进一步的聚合:

WITH cte AS (
    SELECT *, CEIL((ROW_NUMBER() OVER(PARTITION BY date ORDER BY time)+1)/2) AS rn 
    FROM history
), cte2 AS (
    SELECT MAX(time) AS "endtime",
           MIN(time) AS "startime",
           CAST(MAX(time)-MIN(time) AS time) AS "totalneedtocalculatepause"
    FROM cte
    WHERE (date = '2017-11-08'::date)
    GROUP BY rn
)
SELECT MAX(endtime) AS "endtime",
       MIN(startime) AS "startime",
       CAST(SUM(totalneedtocalculatepause) AS TIME) AS "totalneedtocalculatepause"
FROM cte2

输出”:

<表类=“s-表”> <标题> 结束时间 开始时间 总需要计算暂停 <正文> 17:34:13 08:25:57 08:11:33

查看演示 here .

关于sql - 在同一列上迭代时计算持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77087931/

相关文章:

ruby-on-rails-3 - 为什么 where 查询在 postgresql 中不起作用?

sqlite - SQLite时间戳转换功能

mysql - 如何使用 JOIN 对 SUM 的结果进行 GROUP BY 一个 ID

sql - 替换列值

java - 共享数据库连接与私有(private)数据库连接

postgresql - 使用带有 pgbouncer 的事务池有什么优势?

sql - ORA-12560: TNS: 协议(protocol)适配器错误

mysql - 这个SQL命令有什么错误?

java - 如何解析这个日期格式

javascript - 新的日期函数 JavaScript