mysql中按时间范围分组时如何显示范围边界

7eumitmz  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(233)

目前,我使用的解决方案是在一个时间范围内按5分钟的间隔分组,以120秒的间隔对数据进行分组。

SELECT MIN(`datetime`), MAX(`datetime`), SUM(`value`) FROM `machine_log`
WHERE (`datetime` < '2018-05-10 11:00:00') AND (`datetime` >= '2018-05-10 10:50:00')
GROUP BY UNIX_TIMESTAMP(`datetime`) DIV 120;
+---------------------+---------------------+--------------+
| MIN(`datetime`)     | MAX(`datetime`)     | SUM(`value`) |
+---------------------+---------------------+--------------+
| 2018-05-10 10:50:00 | 2018-05-10 10:50:00 |            5 |
| 2018-05-10 10:52:00 | 2018-05-10 10:53:23 |           16 |
| 2018-05-10 10:54:23 | 2018-05-10 10:55:23 |           13 |
| 2018-05-10 10:56:23 | 2018-05-10 10:57:23 |           13 |
| 2018-05-10 10:58:24 | 2018-05-10 10:59:24 |           11 |
+---------------------+---------------------+--------------+

通过这些请求,我还可以从表记录中获得最小和最大日期时间值,但是否可以显示范围边界?预期结果:

+---------------------+---------------------+--------------+
| startdate           | enddate             | SUM(`value`) |
+---------------------+---------------------+--------------+
| 2018-05-10 10:50:00 | 2018-05-10 10:51:59 |            5 |
| 2018-05-10 10:52:00 | 2018-05-10 10:53:59 |           16 |
| 2018-05-10 10:54:00 | 2018-05-10 10:55:59 |           13 |
| 2018-05-10 10:56:00 | 2018-05-10 10:57:59 |           13 |
| 2018-05-10 10:58:00 | 2018-05-10 10:59:59 |           11 |
+---------------------+---------------------+--------------+

表本身如下所示:

+---------------------+-------+
| datetime            | value |
+---------------------+-------+
| 2018-05-10 10:50:00 |     5 |
| 2018-05-10 10:52:00 |     5 |
| 2018-05-10 10:52:23 |     6 |
| 2018-05-10 10:53:23 |     5 |
| 2018-05-10 10:54:23 |     7 |
| 2018-05-10 10:55:23 |     6 |
| 2018-05-10 10:56:23 |     5 |
| 2018-05-10 10:57:23 |     8 |
| 2018-05-10 10:58:24 |     6 |
| 2018-05-10 10:59:24 |     5 |
+---------------------+-------+
iaqfqrcu

iaqfqrcu1#

您的查询工作方式是根据自epoch以来的秒数分组,整数除以120(即除120之后的任何分数都将被删除)。
要计算边界,只需从 GROUP BY 子句,将其乘以120得到句点的开始,再加上119得到句点的结束。使用 FROM_UNIXTIME(...) 将其转换回日期。
几乎可以肯定有一种更优雅的方法,但它确实有效。如果您使用的是MySQL5.6或更早版本,只需替换 ANY_VALUE 任何一个都可以 MIN 或者 MAX (不管是哪一个)它出现在哪里。

SELECT 
    FROM_UNIXTIME(UNIX_TIMESTAMP(ANY_VALUE(`datetime`)) DIV 120 * 120) startdate,
    FROM_UNIXTIME(UNIX_TIMESTAMP(ANY_VALUE(`datetime`)) DIV 120 * 120 + 119) enddate,
    SUM(`value`)
FROM
    `machine_log`
WHERE
    (`datetime` < '2018-05-10 11:00:00')
        AND (`datetime` >= '2018-05-10 10:50:00')
GROUP BY UNIX_TIMESTAMP(`datetime`) DIV 120;

相关问题