在PHP中获取数据的问题

时间:2016-09-29 12:35:53

标签: php mysql sql date datetime

我有以下查询显示当前日期过去两晚的平均温度和相对湿度:

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:0023:59:59之间的数据{1}}

问题在于查询不起作用,因为相同日期之间的平均数据,无论我设置的时间是多少。

如何使用上面提供的信息对过去两晚的数据进行平均。

2 个答案:

答案 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条款。