3

以下のクエリは、MySqlデータベースから気象データを取得し、このデータを1時間ごとの形式にグループ化します。

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)

出力は次のとおりです。

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

現在は18時15分です。上記の出力はすべて、「18」時間に収集されたデータを除いて正しいものです。18:00から18:15までの平均値を取得する代わりに、時間18:00の平均を出力するだけです。すなわち。18:01から18:14までのデータを無視します。

上記のクエリを変更して、現在の時間(18:00から現在)のデータを含めるにはどうすればよいですか?

ありがとう

4

2 に答える 2

4

なぜあなたは単に試してみませんか

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 ) 
于 2012-11-13T18:28:35.633 に答える
3

私は@Ankurの答えに同意します(フィルター引用は現在の時間までのレコードをフィルターするのではなく、現在の時刻までフィルターする必要があります)が、日付/時刻の操作は非常に奇妙です:

  1. (SELECT Hour(NOW()))取得するためにサブクエリは必要ありませんHOUR(NOW())

  2. ( Curdate() + INTERVAL (SELECT Hour(NOW())) hour - INTERVAL 23 hour )もっと簡単に表現できます:

    CURDATE() + INTERVAL HOUR(NOW()) - 23 HOUR
    

    または、私の見解では、より明確に:

    DATE_FORMAT(NOW() - INTERVAL 23 HOUR, '%Y-%m-%d %H:00:00')
    
  3. あなたのORDER BY句は定数であるため、何も達成しません: で注文するつもりでしたhourか?

したがって:

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
于 2012-11-13T18:43:42.960 に答える