我遇到了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分钟获取一次数据?
答案 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
:要进行区间运算,不要将整个区间事项括在引号中,并且对时间单位使用单数名称。即。
'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
将无效,因为结果数字可能代表每小时最后一个时间间隔的无效日期。