MySQLで連続した日付のデータを作成する


はじめに

自分用にコピペできるように残しておく

連続したある期間の日付をテストデータに使いたかったのが始まり

環境

MySQL バージョン忘れた

参考サイト

やり方

TEST_TABLE_1 にTEST_TABLE_2からデータを持ってきつつ、連続した日付になるようなデータにしたい。
まず結果から、

SET @start_day = '2021-01-01'; #期間の始め
SET @end_day = '2021-02-01';   #期間の終わり
INSERT INTO
    TEST_TABLE_1 (COLUMN_1, COLUMN_2, DATE_1)
SELECT
     TEST_TABLE_2.DATA_1 #TEST_TABLE_2からデータを持ってくる
    ,TEST_TABLE_2.DATA_2 #TEST_TABLE_2からデータを持ってくる
    ,TEST_DATE.DAY
FROM
    TEST_TABLE_2 INNNER JOIN (
        SELECT DATE_FORMAT(DATE_ADD(@start_day, INTERVAL tmp.series DAY), '%Y-%m-%d') AS DAY
        FROM (
            SELECT 0 series FROM DUAL WHERE (@num:=-1)*0 UNION ALL
            SELECT @num:=@num+1 FROM `information_schema`.COLUMNS
        ) AS tmp
        HAVING DATE_FORMAT(day, '%Y-%m-%d') < @end_day
    ) AS TEST_DATE
;

こんな感じでいけた。
登録されるデータはこんな感じ

DATA_1,DATA_2,2021-01-01
DATA_1,DATA_2,2021-01-02
:
DATA_1,DATA_2,2021-01-30
DATA_1,DATA_2,2021-01-31

TEST_DATEについて、

SET @start_day = '2021-01-01'; #期間の始め
SET @end_day = '2021-02-01';   #期間の終わり
SELECT DATE_FORMAT(DATE_ADD(@start_day, INTERVAL tmp.series DAY), '%Y-%m-%d') AS DAY
FROM (
    SELECT 0 series FROM DUAL WHERE (@num:=-1)*0 UNION ALL
    SELECT @num:=@num+1 FROM `information_schema`.COLUMNS
) AS tmp
HAVING DATE_FORMAT(day, '%Y-%m-%d') < @end_day
;

この結果がこれ

day
----------
2021-01-01
2021-01-02
:
2021-01-30
2021-01-31

まとめ

バージョンによっては警告がでるかも。(テストに使うデータを作成するだけなので無視でOK)

以上