将MySQL数据分组为任意大小的时间桶

时间:2010-04-05 17:19:43

标签: mysql time

如何根据时间单位任意的每单位时间的时间戳列来计算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 个答案:

答案 0 :(得分:23)

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。 (如果你需要在一个疯狂的非​​四分之一小时对齐的时区中拥有本地时间,那么你需要一个黑客偏移。)

答案 1 :(得分:4)

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

这样,无论你的间隔是什么,通过包括小时* 60分钟将在给定的一天中按顺序保持它并且你将不会处理每小时仅15分钟,但每小时15分钟的OWN小时...将该列添加到group by子句中,您可以按其序号位置执行此操作。

答案 2 :(得分: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