在MySQL中,将单个表中的数据计入每小时桶的好方法是什么?
我试过了,
SELECT count(*) FROM tournament GROUP BY HOUR(date_created)
但是这会将不同时间的小时分组在一起,因为它只是将小时数值用作石斑鱼。
我想使用date_created
作为石斑鱼,但没有时间单位少于时间。但是可能有更好的方法来实现这一目标。
有什么建议吗?
答案 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_created
列DATETIME
格式认为您只能GROUP BY
小时,天和月(可能是年)?
SELECT count(*) FROM tournament GROUP BY HOUR(date_created), DAY(date_created), MONTH(date_created)
答案 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>