2

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

我试过了,

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

但这会将不同日期的时间组合在一起,因为它只是使用小时数值作为分组。

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

有什么建议么?

4

4 回答 4

3

您可以格式化日期使用DATE_FORMAT以包括直到一小时的所有重要部分:

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

DATE_FORMAT返回一个字符串,要获取 MySQL 日期时间,请使用以下内容

GROUP BY STR_TO_DATE(DATE_FORMAT(date_created, '%Y-%m-%d %H'), '%Y-%m-%d %H')
于 2013-06-04T15:13:36.550 回答
1

尝试:

GROUP BY YEAR(date_created), MONTH(date_created), DAY(date_created), HOUR(date_created)
于 2013-06-04T15:13:24.250 回答
1

我想你的date_created专栏是DATETIME格式认为你可以只是GROUP BY几个小时,几天和一个月(也许几年)?

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

您可以在此处查看日期和时间函数的文档

于 2013-06-04T15:13:31.933 回答
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>
于 2013-06-04T15:29:24.250 回答