您需要插入每一行的日期时间;如果那是表中的一列,那是最简单的。 (我们在这里假设该列名为inserted_dt。)
我们真正需要的只是一个对inserted_dt 进行运算的表达式,以便在给定的半小时内为每个值返回一个值。
如果我们需要“小时”间隔,而不是“半小时”间隔,那就很容易了:
DATE_FORMAT(t.inserted_dt,'%Y-%m-%d %H:00:00')
让我们将第一个“半小时”范围定义为分钟 >= '00' AND 分钟
要从inserted_dt 列中取出“分钟”,我们可以使用其中的任何一个
EXTRACT(MINUTE FROM t.inserted_dt)
DATE_FORMAT(t.inserted_dt,'%i')
我们可以使用条件测试来判断分钟值是否小于30,或者翻转过来测试是否大于等于30:
DATE_FORMAT(t.inserted_dt,'%i')+0 >= 30
我们可以通过添加 0 或 30 分钟的间隔将其与“年-月-日-小时”重新组合在一起,
DATE_FORMAT(t.inserted_dt,'%Y-%m-%d %H:00:00')
+ INTERVAL 30*(DATE_FORMAT(t.inserted_dt,'%i')+0>=30) MINUTE
(我们可以使用很多表达式来做类似的事情;这只是我们可以用来返回 DATETIME 数据类型的最短表达式之一
现在,我们只需将表达式添加到查询的 SELECT 列表中,我们就会得到一个标识“半小时”的值。
要获得每半小时范围的“计数”,只需简单的 COUNT() 聚合和 GROUP BY。 “诀窍”是我们在GROUP BY 子句中使用了新的“半小时”表达式。
SELECT DATE_FORMAT(t.inserted_dt,'%Y-%m-%d %H:00:00')
+ INTERVAL 30*(DATE_FORMAT(t.inserted_dt,'%i')+0>=30) MINUTE AS halfhour
, COUNT(*)
FROM mytable t
GROUP BY halfhour
显然,如果您只想返回指定日期时间范围的结果,请添加 WHERE 子句,
SELECT DATE_FORMAT(t.inserted_dt,'%Y-%m-%d %H:00:00')
+ INTERVAL 30*(DATE_FORMAT(t.inserted_dt,'%i')+0>=30) MINUTE AS halfhour
, COUNT(*)
FROM mytable t
WHERE t.inserted_dt >= '2014-08-12'
AND t.inserted_dt < '2014-08-12' + INTERVAL 1 DAY
GROUP BY halfhour