目前,我使用的解决方案是在一个时间范围内按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 |
+---------------------+-------+
1条答案
按热度按时间iaqfqrcu1#
您的查询工作方式是根据自epoch以来的秒数分组,整数除以120(即除120之后的任何分数都将被删除)。
要计算边界,只需从
GROUP BY
子句,将其乘以120得到句点的开始,再加上119得到句点的结束。使用FROM_UNIXTIME(...)
将其转换回日期。几乎可以肯定有一种更优雅的方法,但它确实有效。如果您使用的是MySQL5.6或更早版本,只需替换
ANY_VALUE
任何一个都可以MIN
或者MAX
(不管是哪一个)它出现在哪里。