MySQL で日付の疑似表を作る #mysql

概要

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日か)