在 MySQL 中,将单个表中的数据计入每小时存储桶的好方法是什么?
我试过了,
SELECT count(*) FROM tournament GROUP BY HOUR(date_created)
但这会将不同日期的时间组合在一起,因为它只是使用小时数值作为分组。
我想date_created
用作石斑鱼,但没有时间单位少于小时。但可能有更好的方法来实现这一点。
有什么建议么?
您可以格式化日期使用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')
尝试:
GROUP BY YEAR(date_created), MONTH(date_created), DAY(date_created), HOUR(date_created)
我想你的date_created
专栏是DATETIME
格式认为你可以只是GROUP BY
几个小时,几天和一个月(也许几年)?
SELECT count(*) FROM tournament GROUP BY HOUR(date_created), DAY(date_created), MONTH(date_created)
使用日期的时间戳,您可以这样做:
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>