我要求计算号码。每半小时插入一张表的记录。如果有5条记录,则从11到11 30记录,如果有4条记录,则记录如何找到11号记录。记录
答案 0 :(得分:0)
您需要插入每一行的日期时间;如果这是表格中的一列,那么它是最简单的。 (我们在此假设该列名为inserted_dt
。)
我们真正需要的是一个表达式,它在inserted_dt
上运行,为给定的半小时内的每个值返回一个值。
如果我们需要"小时"间隔,而不是"半小时"间隔,这将非常容易:
DATE_FORMAT(t.inserted_dt,'%Y-%m-%d %H:00:00')
让我们定义第一个"半小时"范围为分钟> =' 00'和分钟< ' 30'
获得"分钟"在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分钟的间隔将其与“#year; year-month-day-hour"”重新组合起来,
DATE_FORMAT(t.inserted_dt,'%Y-%m-%d %H:00:00')
+ INTERVAL 30*(DATE_FORMAT(t.inserted_dt,'%i')+0>=30) MINUTE
(我们可以使用很多表达式来做类似的事情;这只是我们可以用来返回DATETIME数据类型的最短表达式之一
现在,我们只是将表达式添加到查询的SELECT列表中,我们得到一个标识" halfhour"的值。
获得"计数"对于每个半小时范围,这只是一个简单的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