你如何按小时增量分组MySQL?

时间:2013-06-04 15:10:55

标签: mysql group-by

在MySQL中,将单个表中的数据计入每小时桶的好方法是什么?

我试过了,

SELECT count(*) FROM tournament GROUP BY HOUR(date_created)

但是这会将不同时间的小时分组在一起,因为它只是将小时数值用作石斑鱼。

我想使用date_created作为石斑鱼,但没有时间单位少于时间。但是可能有更好的方法来实现这一目标。

有什么建议吗?

4 个答案:

答案 0 :(得分:3)

您可以设置日期使用格式DATE_FORMAT以包含截至小时的所有重要部分:

GROUP BY DATE_FORMAT(date_created, '%Y-%m-%d %H')

DATE_FORMAT返回一个字符串,以获取MySQL DateTime,使用以下

GROUP BY STR_TO_DATE(DATE_FORMAT(date_created, '%Y-%m-%d %H'), '%Y-%m-%d %H')

答案 1 :(得分:1)

尝试:

GROUP BY YEAR(date_created), MONTH(date_created), DAY(date_created), HOUR(date_created)

答案 2 :(得分:1)

我认为您的date_createdDATETIME格式认为您只能GROUP BY小时,天和月(可能是年)?

SELECT count(*) FROM tournament GROUP BY HOUR(date_created), DAY(date_created), MONTH(date_created)

您可以查看日期和时间功能的文档here

答案 3 :(得分:1)

使用日期的时间轴,你可以这样做:

SELECT COUNT(1),TimeStampHour FROM
(
    SELECT
        FROM_UNIXTIME(UNIX_TIMESTAMP(date_created) -
        MOD(UNIX_TIMESTAMP(date_created),3600)) TimeStampHour
    FROM tournament
) A GROUP BY TimeStampHour;

或者您只想将时间戳作为数字

SELECT COUNT(1),TimeStampHour FROM
(
    SELECT
        UNIX_TIMESTAMP(date_created) -
        MOD(UNIX_TIMESTAMP(date_created),3600) TimeStampHour
    FROM tournament
) A GROUP BY TimeStampHour;

试一试!!!

解释

使用数字3600的原因是一小时内有3600秒。您需要减去时间戳的模数和3600,以获得从时间戳中删除的秒数,以获得精确小时的时间戳。

以下是演示此内容的示例代码:

SELECT *,
    ts_now - ts_extra ts_hr,
    FROM_UNIXTIME(ts_now - ts_extra) hr
FROM
(SELECT
    NOW() now,
    UNIX_TIMESTAMP(NOW()) ts_now,
    MOD(UNIX_TIMESTAMP(NOW()),3600) ts_extra
) A;

当我现在运行它时,我得到了这个

mysql> SELECT *,
    ->     ts_now - ts_extra ts_hr,
    ->     FROM_UNIXTIME(ts_now - ts_extra) hr
    -> FROM
    -> (SELECT
    ->     NOW() now,
    ->     UNIX_TIMESTAMP(NOW()) ts_now,
    ->     MOD(UNIX_TIMESTAMP(NOW()),3600) ts_extra
    -> ) A;
+---------------------+------------+----------+------------+---------------------+
| now                 | ts_now     | ts_extra | ts_hr      | hr                  |
+---------------------+------------+----------+------------+---------------------+
| 2013-06-04 11:52:10 | 1370361130 |     3130 | 1370358000 | 2013-06-04 11:00:00 |
+---------------------+------------+----------+------------+---------------------+
1 row in set (0.00 sec)

mysql>