間隔にグループ化
を使用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