向MySQL查询解释“如何将时间列分为5分钟间隔”

时间:2019-04-17 15:23:02

标签: mysql

我为这里的问题找到了各种解决方案:

patchwork

How to group time column into 5 minute intervals and max/min value respectively SQL?

https://dba.stackexchange.com/questions/195353/grouping-data-into-5-minute-intervals-within-a-time-range

解决任务的代码如下:

SELECT
  FROM_UNIXTIME((UNIX_TIMESTAMP(table.timestamp) DIV 300) * 300) AS Timestamp,
val AS AgregatedValue
From foo
GROUP BY Timestamp
ORDER BY Timestamp

有人可以解释为什么提供的解决方案有效吗? 我找不到很好地描述其实际工作原理的答案。 为什么首先将DIV乘300秒,最后再乘300秒? 在“背景”中会发生什么?

我阅读了有关UNIX_TIMESTAMP(timestamp)的文档,该文档自UTC 1970年1月1日00:00:00起以秒为单位将参数值返回为无符号整数。 我知道FROM_UNIXTIME()可能是UNIX_TIMESTAMP(timestamp)的反向功能

也许这个问题很愚蠢,但是我被困住了。

2 个答案:

答案 0 :(得分:1)

答案在令牌DIV中。

DIV不仅将(/)除,而且还隐式转换为整数。

您这样做是为了获得不带整数的整数。基本上,这与在分割后使用显式强制转换或在分割后使用ROUND()FLOOR()相同。

参考:

https://dev.mysql.com/doc/refman/8.0/en/arithmetic-functions.html

  

整数除法。从除法中丢弃会导致任何小数   小数点右边的部分。

答案 1 :(得分:1)

UNIX_TIMESTAMP(table.timestamp)包含一个日期,该日期存储为从1970-01-01 00:00:00'UTC开始的秒数。

5分钟内您有300秒

因此UNIX_TIMESTAMP(table.timestamp)乘300会返回每300个零件中您拥有的零件数。  这个整数部分是一个乘以300的数字

UNIX_TIMESTAMP(table.timestamp) DIV 300) * 300

每5分钟返回一次秒数

最后一次转换

  FROM_UNIXTIME((UNIX_TIMESTAMP(table.timestamp) DIV 300) * 300)

返回日期并用于分组依据

SELECT
  FROM_UNIXTIME((UNIX_TIMESTAMP(table.timestamp) DIV 300) * 300) AS Timestamp,
val AS AgregatedValue
From foo
GROUP BY Timestamp
ORDER BY Timestamp