ストアドプロシージャ、一時テーブルはなく、クエリは1つだけで、日付列にインデックスが指定された効率的な実行プラン:
select
subdate(
'2012-12-31',
floor(dateDiff('2012-12-31', dateStampColumn) / 30) * 30 + 30 - 1
) as "period starting",
subdate(
'2012-12-31',
floor(dateDiff('2012-12-31', dateStampColumn) / 30) * 30
) as "period ending",
count(*)
from
YOURTABLE
group by floor(dateDiff('2012-12-31', dateStampColumn) / 30);
この呪文を除いて、ここで何が起こっているのかはかなり明白なはずです:
floor(dateDiff('2012-12-31', dateStampColumn) / 30)
その式は数回出現し、30日前のdateStampColumn
の数に評価されます。 は。 dateDiff
差を日数で返し、30で割って、30日の期間で取得し、すべてをfloor()
にフィードします。 整数に丸めます。この番号を取得したら、GROUP BY
できます さらに、この数値を期間の開始日と終了日に変換するために、少し計算を行います。
'2012-12-31'
を置き換えます now()
を使用 必要に応じて。サンプルデータは次のとおりです。
CREATE TABLE YOURTABLE
(`Id` int, `dateStampColumn` datetime);
INSERT INTO YOURTABLE
(`Id`, `dateStampColumn`)
VALUES
(1, '2012-10-15 02:00:00'),
(1, '2012-10-17 02:00:00'),
(1, '2012-10-30 02:00:00'),
(1, '2012-10-31 02:00:00'),
(1, '2012-11-01 02:00:00'),
(1, '2012-11-02 02:00:00'),
(1, '2012-11-18 02:00:00'),
(1, '2012-11-19 02:00:00'),
(1, '2012-11-21 02:00:00'),
(1, '2012-11-25 02:00:00'),
(1, '2012-11-25 02:00:00'),
(1, '2012-11-26 02:00:00'),
(1, '2012-11-26 02:00:00'),
(1, '2012-11-24 02:00:00'),
(1, '2012-11-23 02:00:00'),
(1, '2012-11-28 02:00:00'),
(1, '2012-11-29 02:00:00'),
(1, '2012-11-30 02:00:00'),
(1, '2012-12-01 02:00:00'),
(1, '2012-12-02 02:00:00'),
(1, '2012-12-15 02:00:00'),
(1, '2012-12-17 02:00:00'),
(1, '2012-12-18 02:00:00'),
(1, '2012-12-19 02:00:00'),
(1, '2012-12-21 02:00:00'),
(1, '2012-12-25 02:00:00'),
(1, '2012-12-25 02:00:00'),
(1, '2012-12-26 02:00:00'),
(1, '2012-12-26 02:00:00'),
(1, '2012-12-24 02:00:00'),
(1, '2012-12-23 02:00:00'),
(1, '2012-12-31 02:00:00'),
(1, '2012-12-30 02:00:00'),
(1, '2012-12-28 02:00:00'),
(1, '2012-12-28 02:00:00'),
(1, '2012-12-30 02:00:00');
そしてその結果:
period starting period ending count(*)
2012-12-02 2012-12-31 17
2012-11-02 2012-12-01 14
2012-10-03 2012-11-01 5
期間のエンドポイントは包括的です。
SQLFiddle でこれを試してみてください 。
一致する行がゼロの30日間は結果に含まれないという点で、少し間抜けな可能性があります。期間のテーブルに対してこれを結合できれば、それを排除できます。ただし、MySQLにはPostgreSQLの generate_series()のようなものはありません。 a> 、したがって、アプリケーションでそれを処理するか、を試す必要がありますこの巧妙なハック 。