[英]SQL Hourly Data
The query below retrieves weather data from a MySql database, and groups this data in to an hourly format. 下面的查询从MySql数据库中检索天气数据,并将此数据分组为每小时格式。
select hour(datetime) AS hour
, avg(Temperature) as AVGT
from Database.minute
WHERE DATETIME
BETWEEN (CURDATE() + INTERVAL (SELECT hour(NOW())) hour - INTERVAL 23 hour)
AND ((CURDATE() + INTERVAL (SELECT hour(NOW())) hour))
group by hour
order by (CURDATE() + INTERVAL (SELECT hour(NOW())) hour - INTERVAL 23 hour)
Output is as follows: 输出如下:
hour AVGT
19 11.730
20 11.970
21 11.970
22 11.760
23 11.660
0 11.700
1 11.830
2 12.370
3 12.770
4 12.840
5 12.840
6 12.540
7 12.500
8 12.030
9 12.100
10 12.300
11 12.060
12 11.090
13 10.920
14 10.920
15 10.820
16 10.760
17 10.690
18 10.560
The time is now 18:15. 现在时间是18:15。 All of the above output is correct apart from the data gathered for hour '18'.
除了为'18'小时收集的数据之外,所有上述输出都是正确的。 Instead of getting the average value between 18:00 and 18:15, it just outputs the average at time 18:00.
它不是在18:00到18:15之间获得平均值,而是在18:00时输出平均值。 ie.
即。 ignoring data between 18:01 and 18:14.
在18:01和18:14之间忽略数据。
How can I modify the above query to include data in the current hour (18:00 to Now)? 如何修改上述查询以包含当前小时(18:00到现在)的数据?
Thanks 谢谢
Why don't you simply try 你为什么不试试呢?
SELECT Hour(datetime) AS hour,
Avg(temperature) AS AVGT
FROM DATABASE.minute
WHERE datetime BETWEEN ( Curdate() + INTERVAL (SELECT Hour(Now())) hour -
INTERVAL 23 hour ) AND Now()
GROUP BY hour
ORDER BY ( Curdate() + INTERVAL (SELECT Hour(Now())) hour - INTERVAL 23 hour )
I agree with @Ankur's answer (your filter citerion should not filter records up to the current hour, but rather the current time), however your date/time operations are very strange: 我同意@ Ankur的回答 (你的过滤器citerion不应该过滤记录到当前时间,而是当前时间),但是你的日期/时间操作非常奇怪:
You don't need a subquery (SELECT Hour(NOW()))
to obtain HOUR(NOW())
; 你不需要子查询
(SELECT Hour(NOW()))
来获得HOUR(NOW())
;
You can express ( Curdate() + INTERVAL (SELECT Hour(NOW())) hour - INTERVAL 23 hour )
more simply: 您可以更简单地表达
( Curdate() + INTERVAL (SELECT Hour(NOW())) hour - INTERVAL 23 hour )
:
CURDATE() + INTERVAL HOUR(NOW()) - 23 HOUR
Or, in my view, more clearly: 或者,在我看来,更清楚:
DATE_FORMAT(NOW() - INTERVAL 23 HOUR, '%Y-%m-%d %H:00:00')
Your ORDER BY
clause is a constant and therefore achieves nothing: did you mean to order by hour
? 你的
ORDER BY
子句是一个常数,因此没有任何结果:你的意思是按hour
排序吗?
Therefore: 因此:
SELECT HOUR(datetime) AS hour,
AVG(Temperature) AS AVGT
FROM Database.minute
WHERE datetime BETWEEN
DATE_FORMAT(NOW() - INTERVAL 23 HOUR, '%Y-%m-%d %H:00:00')
AND NOW()
GROUP BY hour
ORDER BY hour
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.