6

MySQL に問題があります。2 つの特定の時間の間の MySQL からのデータの平均が必要です。

そのために、私は使用しています:

select avg(Column) 
from Databasename.tablename 
where datetime BETWEEN '2012-09-08 00:00:00' AND '2012-09-08 15:30:00'

ここで必要なのは、指定された時間の 5 分ごとのデータの平均です。これを使用して:

select avg(Column) 
from Databasename.Tablename 
where datetime BETWEEN '2012-09-08 15:00:00' 
                   AND '2012-09-08 15:30:00' + 'INTERVAL 5minutes'

エラーは表示されていませんが、表示されていNULLます。

特定の 2 つの期間内の 5 分ごとのデータを取得するにはどうすればよいですか?

4

1 に答える 1

16

間隔にグループ化

を使用group byして、平均化する間隔ごとに 1 つのグループを作成する必要があります。

select avg(Column), convert((min(datetime) div 500)*500 + 230, datetime) as time
from Databasename.tablename 
where datetime BETWEEN '2012-09-08 00:00:00' AND '2012-09-08 15:30:00'
group by datetime div 500

これは、日付と時刻を暗黙的に数値に変換できるという事実を利用しており、その数値は の形式になりますYYMMDDhhmmss。このような数値を 100 で割ると秒が取り除かれ、同様に 500 で割ると、5 分間隔ごとに一意の数値が得られます。

私が選択した追加の列は、間隔の中央を示します: 間隔からの任意の時間 (ここでは最小値を選択しますが、実際には問題ではありません)、その 5 分の間隔番号に変換され、日付と時刻に戻ります数、次に 2 分半を追加します。同様の構文を使用して、間隔の開始 (単純に+ 230除外) または (包括的) 終了 ( + 459) を計算できます。

sqlfiddleを使用してテスト済み。

範囲の終了処理

範囲には、その時点で開始された間隔からのBETWEEN行が含まれますが、それ以外の行は含まれないことに注意してください。15:30:00範囲の終わりを選択から除外したい場合があります。

where datetime >= '2012-09-08 00:00:00' AND datetime < '2012-09-08 15:30:00'

NULL になる理由

クエリが得られる理由についてNULL:間隔演算を行うには、間隔全体を引用符で囲まず、時間単位に単数形の名前を使用します。いえ

'2012-09-08 15:30:00' + INTERVAL 5 minute

しかし、これは単に範囲を拡張するだけで、希望2012-09-08 15:35:00する 5 分間隔を作成しません。あなたが書いた方法では、2 つの文字列を追加しようとしていますが、文字列を数値に変換できない限り、MySQL では不可能です。その場合、それらの数値が追加されます。

間隔演算を使用して、間隔の排他的な終了、つまり間隔のの最初の 1 秒を計算したい場合があります。

 convert((min(datetime) div 500)*500, datetime) + INTERVAL 5 minute as endOfInterval

結果の数値が各時間の最後の間隔の無効な日付を表す可能性があるため、クエリの500代わりに追加するだけでは機能しません。230

于 2012-09-10T05:24:47.267 に答える