6

我的 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 分钟获取一次数据?

4

1 回答 1

16

分组到间隔

您应该使用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我的查询将不起作用,因为结果数字可能代表每小时最后一个间隔的无效日期。

于 2012-09-10T05:24:47.267 回答