代码之家  ›  专栏  ›  技术社区  ›  Eric J.

将mysql数据分组成任意大小的时间段

  •  20
  • Eric J.  · 技术社区  · 14 年前

    如果时间单位是任意的,那么如何根据每个时间单位的时间戳列计算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分钟的时间来分组呢?

    3 回复  |  直到 14 年前
        1
  •  23
  •   bobince    14 年前
    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 offset)。

        2
  •  4
  •   DRapp    14 年前

    取(hour(datefield)*60+minutes(datefield))/yourlinterval的整数怎么样?

    这样,无论你的时间间隔是多少,通过包含小时*60分钟,它将在给定的一天内保持顺序,并且你不会只处理每小时15分钟的分组,而是每15分钟处理一个小时的分组…将该列添加到GROUPBY子句中,可以按其序号位置执行此操作。

        3
  •  3
  •   Marcus Adams    14 年前

    只是让你想想,这里有一个替代方案 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