如何在 MySQL 中每小时查找温度值的平均值。另外如何计算 3 小时、6 小时、9 小时和 12 小时的平均温度?

时间:2021-01-12 20:41:34

标签: mysql raspberry-pi

我使用 Raspberry Pi 和 DHT11 每 5 分钟在 MySQL 数据库中记录温度和湿度数据。

MariaDB [measurements]> desc measurements;
+-------------+------------+------+-----+---------+-------+
| Field       | Type       | Null | Key | Default | Extra |
+-------------+------------+------+-----+---------+-------+
| ttime       | datetime   | YES  |     | NULL    |       |
| temperature | float(4,1) | YES  |     | NULL    |       |
| humidity    | float(4,1) | YES  |     | NULL    |       |
+-------------+------------+------+-----+---------+-------+
3 rows in set (0.004 sec)
MariaDB [measurements]> select * from measurements order by ttime limit 10;
+---------------------+-------------+----------+
| ttime               | temperature | humidity |
+---------------------+-------------+----------+
| 2021-01-06 22:10:03 |        28.0 |     59.0 |
| 2021-01-06 22:14:56 |        30.0 |     52.0 |
| 2021-01-06 22:19:47 |        30.0 |     93.0 |
| 2021-01-06 22:54:39 |        28.0 |     57.0 |
| 2021-01-06 23:16:51 |        27.0 |     59.0 |
| 2021-01-06 23:18:04 |        28.0 |     60.0 |
| 2021-01-06 23:19:36 |        27.0 |     59.0 |
| 2021-01-06 23:21:16 |        27.0 |     59.0 |
| 2021-01-07 00:35:39 |        28.0 |     60.0 |
| 2021-01-07 00:37:03 |        27.0 |     60.0 |
+---------------------+-------------+----------+
10 rows in set (0.004 sec)

我能够根据以下代码找到每天的平均温度:

MariaDB [measurements]> select avg(temperature),datediff(sysdate(),ttime) diff
    -> from measurements 
    -> group by diff
    -> order by ttime desc limit 10;
+------------------+------+
| avg(temperature) | diff |
+------------------+------+
|         25.25000 |    0 |
|         26.02041 |    1 |
|         27.00000 |    2 |
|         26.00000 |    3 |
|         26.26490 |    4 |
|         26.08187 |    5 |
|         27.33333 |    6 |
|         28.12500 |    7 |
+------------------+------+
8 rows in set (0.010 sec)

我想获得每小时的平均温度,因此输出可以如下:
(例如,第一个读数是 2021-01-06 上午 10 点,平均温度是 28.0。此平均值是根据上午 9:00 至上午 10:00 之间的读数计算得出的)

Expected output:
+---------------------+-------------+
| ttime               | AVG Temp    | 
+---------------------+-------------+
| 2021-01-06 10:00:00 |        28.0 |    
| 2021-01-06 09:00:00 |        30.0 |     
| 2021-01-06 08:00:00 |        30.0 |    
| 2021-01-06 07:00:00 |        28.0 |     
| 2021-01-06 06:00:00 |        27.0 |     
| 2021-01-06 05:00:00 |        28.0 |    
| 2021-01-06 04:00:00 |        27.0 |    
| 2021-01-06 03:00:00 |        27.0 |    
| 2021-01-06 02:00:00 |        28.0 |    
| 2021-01-06 01:00:00 |        27.0 |     
+---------------------+-------------+

每小时将有(60 分钟/5 分钟)= 12 个读数。因此每行输出包含最多 12 个读数的平均值。

我知道 timediff 命令,但不确定这会有什么帮助。

MariaDB [measurements]> select timediff(sysdate(), ttime)
    -> from measurements
    -> order by ttime
    -> desc
    -> limit 10;
+----------------------------+
| timediff(sysdate(), ttime) |
+----------------------------+
| 00:02:28                   |
| 00:07:28                   |
| 00:12:28                   |
| 00:17:28                   |
| 00:22:28                   |
| 00:27:28                   |
| 00:32:26                   |
| 00:37:28                   |
| 00:42:28                   |
| 00:47:28                   |
+----------------------------+
10 rows in set (0.005 sec)

对此的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

你可以使用hour()

select avg(temperature),date(ttime), hour(ttime)
 from measurements 
 group by date(ttime),  hour(ttime)
 order by date(ttime) desc, hour(ttime) desc limit 10;