【问题标题】:Explain MySQL Query for "How to group time column into 5 minute intervals"解释 MySQL 查询“如何将时间列分组为 5 分钟间隔”
【发布时间】:2019-09-07 21:47:14
【问题描述】:

我在这里找到了解决问题的各种方法:

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

Grouping into interval of 5 minutes 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-01-01 00:00:00' 以来以秒为单位的无符号整数返回参数的值。 我知道FROM_UNIXTIME()恰好是UNIX_TIMESTAMP(timestamp)的反函数

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

【问题讨论】:

  • 这是个好问题,不傻!我们会认为/ 300) * 300 已过时,但您发现“在后台”发生了一些事情。所以我觉得这是一个非常聪明和聪明的问题。

标签: mysql


【解决方案1】:

答案在令牌DIV中。

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

你这样做是为了得到一个没有余数的整数。基本上,这与在除法后使用显式转换,或在除法后使用ROUND() 或FLOOR() 相同。

参考:

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

整数除法。从除法结果中丢弃任何小数 小数点右边的部分。

【讨论】:

    【解决方案2】:

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

    5分钟内你有300秒

    所以UNIX_TIMESTAMP(table.timestamp) by 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
    

    【讨论】:

      猜你喜欢
      • 2014-01-04
      • 2021-05-14
      • 2016-08-31
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-06
      • 1970-01-01
      相关资源
      最近更新 更多