分组到间隔
您应该使用group by
为要平均的每个间隔创建一个组。
select avg(Column), convert((min(datetime) div 500)*500 + 230, datetime) as time
from Databasename.tablename
where datetime BETWEEN '2012-09-08 00:00:00' AND '2012-09-08 15:30:00'
group by datetime div 500
这利用了日期和时间可以隐式转换为数字的事实,该数字随后将具有格式YYMMDDhhmmss
。将这样的数字除以 100 会去除秒数,类似地除以 500 会为每 5 分钟间隔生成一个唯一数字。
我选择的附加列将给出间隔的中间值:间隔中的任何时间(这里选择最小值,但这并不重要),变成那个 5 分钟的间隔数,回到日期和时间数字,然后加上两分半钟。您可以使用类似的语法来计算间隔的开始(简单地+ 230
省略)或(包括)结束 ( + 459
)。
使用sqlfiddle测试。
范围处理结束
请注意,您的BETWEEN
范围将包括15:30:00
从当时开始的间隔中的行,但不包括其他行。也许您想从您的选择中排除范围的结尾:
where datetime >= '2012-09-08 00:00:00' AND datetime < '2012-09-08 15:30:00'
为什么你得到 NULL
至于为什么您的查询会产生NULL
:要进行区间算术,您不要将整个区间事物括在引号中,并且您使用单数名称作为时间单位。IE
'2012-09-08 15:30:00' + INTERVAL 5 minute
但这只会将范围扩展到2012-09-08 15:35:00
并且仍然不会创建您想要的那些 5 分钟间隔。您编写它的方式是尝试添加两个字符串,这在 MySQL 中是不可能的,除非字符串可以转换为数字,在这种情况下将添加这些数字。
您可能希望使用区间算术来计算区间的唯一结束,即区间后的第一秒:
convert((min(datetime) div 500)*500, datetime) + INTERVAL 5 minute as endOfInterval
简单地添加500
而不是230
我的查询将不起作用,因为结果数字可能代表每小时最后一个间隔的无效日期。