【问题标题】:Group MySQL Data into Arbitrarily Sized Time Buckets将 MySQL 数据分组到任意大小的时间桶中
【发布时间】:2010-04-06 01:51:31
【问题描述】:

如果时间单位是任意的,如何根据每单位时间的时间戳列计算MySQL表中的记录数?

具体来说,我想计算在给定时间间隔内有多少记录的时间戳落入 15 分钟的存储桶中。我了解如何使用 MySQL 日期函数在 1 秒、1 分钟、1 小时、1 天等时间段内执行此操作,例如

SELECT YEAR(datefield) Y, MONTH(datefield) M, DAY(datefield) D, COUNT(*) Cnt FROM mytable GROUP BY YEAR(datefield), MONTH(datefield), DAY(datefield)

但是如何按 15 分钟的存储桶分组?

【问题讨论】:

    标签: mysql time


    【解决方案1】:
    GROUP BY
        YEAR(datefield),
        MONTH(datefield),
        DAY(datefield),
        HOUR(datefield),
        FLOOR(MINUTE(datefield)/15)
    

    你也可以直接说:

    SELECT FLOOR(UNIX_TIMESTAMP(datefield)/900) AS t, COUNT(*) AS cnt
    FROM mytable
    GROUP BY t
    

    使用负责将每 15 分钟时间段的时间戳格式化为可读的 y/m/d/h/m 的应用程序。 (如果您需要在疯狂的非刻钟时区设置当地时间,但您需要一个 hack 偏移量。)

    【讨论】:

      【解决方案2】:

      如何获取 (HOUR(DateField) * 60 + MINUTES(DateField)) / YourInterval 的 INTEGER。

      这样,无论您的时间间隔如何,通过包括小时 * 60 分钟,将在给定的一天内保持顺序,您将不会只处理每小时分组的 15 分钟,而是其 OWN 小时的每 15 分钟...将该列添加到您的 group by 子句中,您可以按其序号位置进行操作。

      【讨论】:

        【解决方案3】:

        只是为了让您思考,这里是FLOOR(MINUTE(datefield)/15) 解决方案的替代方案:

        GROUP BY CASE
        WHEN MINUTES(datetime) BETWEEN 0 AND 14 THEN 0
        WHEN MINUTES(datetime) BETWEEN 15 AND 29 THEN 1
        WHEN MINUTES(datetime) BETWEEN 30 AND 44 THEN 2
        WHEN MINUTES(datetime) BETWEEN 45 AND 59 THEN 3
        END
        

        【讨论】:

        • @Marcus:结果与使用 FLOOR 有何不同?
        • @Eric J.,结果是一样的。只是另一种方法。
        • 我有一堆 unixtime 整数。使用它,我可以在代码中设置“时间桶”(月间隔,因此并非所有间隔都相等)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-29
        • 1970-01-01
        • 1970-01-01
        • 2016-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多