给定时间内每5分钟的平均数据

时间:2012-09-10 05:13:35

标签: mysql

我遇到了MySQL的问题。我需要两次特定时间内MySQL的平均数据。

为此,我正在使用:

select avg(Column) 
from Databasename.tablename 
where datetime BETWEEN '2012-09-08 00:00:00' AND '2012-09-08 15:30:00'

现在,我需要的是在给定时间内每5分钟的平均数据。通过使用:

select avg(Column) 
from Databasename.Tablename 
where datetime BETWEEN '2012-09-08 15:00:00' 
                   AND '2012-09-08 15:30:00' + 'INTERVAL 5minutes'

它没有显示任何错误,只显示NULL

如何在两个特定时间段内每5分钟获取一次数据?

1 个答案:

答案 0 :(得分:13)

分组到间隔

您应该使用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:要进行区间运算,不要将整个区间事项括在引号中,并且对时间单位使用单数名称。即。

'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将无效,因为结果数字可能代表每小时最后一个时间间隔的无效日期。