概要
MySQL で日付の疑似表を作るクエリ。
集計分析等で、データがない日付も一覧としては出したいようなケースでの利用を想定。
TL;DR
色々試してみたけど、以下に落ち着いた。
SELECT @seq := 0 AS seq , DATE('2020-01-01') AS ymd FROM dual UNION ALL SELECT @seq := @seq + 1 AS seq , DATE_ADD('2019-12-31', INTERVAL @seq DAY) AS calendar FROM information_schema.COLUMNS ORDER BY seq LIMIT 365
解説
連番を発行して、それを日付に足し込むことで実現している。
UNION ALL
しているのは連番の変数宣言をするためで、 クエリが分かれてもいいなら SET @seq := 0;
文で宣言してもいい。
information_schema.COLUMNS
の参照は行数を稼ぐためだけなので、 365 行よりレコードが多ければ何のテーブルでもいい。(ただし閏年は366日か)