我有以下查询显示当前日期过去两晚的平均温度和相对湿度:
SELECT Date(date) AS DateTemp,
Round(Avg(temperature), 2) AS Temperature,
Round(Avg(humidity), 2) AS Humedidity
FROM mt_meteorology
WHERE Date(date) BETWEEN '2016-09-27' AND '2016-09-28'
AND ( Time(date) > '18:00:00'
OR Date(date) BETWEEN '2016-09-28' AND '2016-09-29'
AND Time(date) < '06:00:00' )
GROUP BY Date(date);
例如今天是'2016-09-29'
从我之前的晚上获取数据,如下所示:
夜晚'2016-09-28'
(上一个)包含来自18:00:00
的{{1}}和23:59:59
之间的数据以及来自'2016-09-28'
和00:00:00
之间的数据{1}}
与夜晚6:00:00
相同,包括来自'2016-09-29'
的{{1}}和'2016-09-27'
之间的数据以及来自18:00:00
和23:59:59
之间的数据{1}}
问题在于查询不起作用,因为相同日期之间的平均数据,无论我设置的时间是多少。
如何使用上面提供的信息对过去两晚的数据进行平均。
答案 0 :(得分:1)
如果你像这样使用WHERE语句怎么办: 编辑:也许是因为你的日期列有其他名称?
WHERE DateTemp BETWEEN '2016-09-27 18:00:00' AND '2016-09-28 06:00:00'
AND DateTemp BETWEEN '2016-09-28 18:00:00' AND '2016-09-29 06:00:00'
答案 1 :(得分:1)
最简单的方法可能是创建一个分组列,其时间移动以使夜晚在同一天“
这有效地使所有时间都在您查询的当天00:00到12:00之间进行,将其向前移动6小时。
根据其执行方式,可能还需要在日期字段中直接使用WHERE
子句进行限制。
SELECT
DATE(`date`) AS DateTemp,
ROUND(AVG(`temperature`), 2) AS Temperature,
ROUND(AVG(`humidity`), 2) AS Humidity,
`date` + INTERVAL 6 HOUR AS Grouping
FROM `mt_meteorology`
GROUP BY DATE(Grouping)
HAVING DATE(Grouping) IN ('2016-09-28', '2016-09-29')
AND TIME(Grouping) < '12:00:00'
等效但可能更快的查询是:
SELECT
DATE(`date`) AS DateTemp,
ROUND(AVG(`temperature`), 2) AS Temperature,
ROUND(AVG(`humidity`), 2) AS Humidity
FROM `mt_meteorology`
WHERE DATE(`date` + INTERVAL 6 HOUR) IN ('2016-09-28', '2016-09-29')
AND TIME(`date` + INTERVAL 6 HOUR) < '12:00:00'
GROUP BY DATE(`date` + INTERVAL 6 HOUR)
因为这个具有直接的WHERE
条款。