2017-03-08 90 views
0

我有这样选择每晚的平均在MYSQL

+-----------------------+---------+ 
| DateTime    | Value | 
+-----------------------+---------+ 
| 2015-08-18 19:36:42 | 22  | 
| 2015-08-18 20:48:49 | 20  | 
| 2015-08-18 21:48:49 | 19  | 
| 2015-08-18 22:48:49 | 23  | 
| 2015-08-18 23:48:49 | 20  | 
| 2015-08-19 00:48:49 | 23  | 
| 2015-08-19 01:48:49 | 21  | 
| 2015-08-19 02:48:49 | 15  | 
     ...     ... 
| 2015-08-19 22:30:16 | 21  | 
| 2015-08-19 23:30:16 | 22  | 
| 2015-08-20 00:30:16 | 25  | 
| 2015-08-20 01:30:16 | 26  | 
     ...     ... 
| 2015-08-20 22:30:16 | 19  | 
| 2015-08-20 23:30:16 | 20  | 
| 2015-08-21 00:30:16 | 21  | 
| 2015-08-21 01:30:16 | 21  | 
     ...     ... 

数据,我要选择的每个夜晚的平均值,其中在06从当前日期晚开始在06:00:00和结束日期旁边:00:00。从2015年8月18日作为“2015年8月18日” 思夜想我想最后的结果看起来像下面:

+---------------+---------+ 
| DateTime  | AvgValue| 
+---------------+---------+ 
| 2015-08-18 | 22  | 
| 2015-08-19 | 20  | 
| 2015-08-20 | 19  | 
| 2015-08-21 | 23  | 
| 2015-08-22 | 20  | 
    ...   .. 

我已经去了虽然很多网站,书籍和去虽然大多数教程,但我无法想出如何编写此查询来执行此操作。

任何人都可以帮助我查询以获得上述结果。

回答

0

我建议这样的查询,但它可能会很慢:

select date(`DateTime` - interval 6 hour), avg(`Value`) as AvgValue 
from tblName 
group by date(`DateTime` - interval 6 hour) 
order by 1 asc 

但我强烈建议增加一个额外的列,仅一夜店(无时间)记录属于并添加该列的索引,这样可以更快地处理查询。

+0

非常感谢你这是工作的罚款 –

0
select if(hour(DateTime) >= 18, 
      date(date_add(Datetime, interval 1 day)), date(Datetime)) DateAct,  
     avg(`Value`) as AvgValue 
from  yourTable 
group by DateAct 
order by 1; 

检查在这里:http://rextester.com/KSB39578

+0

这可不行。它会单独显示每一行,因为它们都将有不同的时间,所以根本没有分组 – Psi

+0

是的,它必须转换成日期 – McNets

+0

这不是在你的回答中完成 – Psi