How to populate a table with a range of dates?

后端 未结 10 1414
夕颜
夕颜 2020-11-22 04:24

I need a MySQL table to hold ALL DATES between 2011-01-01 and 2011-12-31. I have created a table with one column names \"_date\", type DATE.

With what query can I po

10条回答
  •  执念已碎
    2020-11-22 05:18

    I recently had a need to create a calendar_date table as below:

    CREATE TABLE `calendar_date` (
        `date`    DATE NOT NULL      -- A calendar date.
        , `day`   SMALLINT NOT NULL  -- The day of the year for the date, 1-366.
        , `month` TINYINT NOT NULL   -- The month number, 1-12.
        , `year`  SMALLINT NOT NULL  -- The year.
        , PRIMARY KEY (`id`));
    

    I then populated it with all possible dates between January 1, 2001 and December 31, 2100 (both inclusive) using the query below:

    INSERT INTO `calendar_date` (`date`
        , `day`
        , `month`
        , `year`)
    SELECT
        DATE
        , INCREMENT + 1
        , MONTH(DATE)
        , YEAR(DATE)
    FROM
        -- Generate all possible dates for every year from 2001 to 2100.
        (SELECT
            DATE_ADD(CONCAT(YEAR, '-01-01'), INTERVAL INCREMENT DAY) DATE
            , INCREMENT
        FROM
            (SELECT
                (UNITS + TENS + HUNDREDS) INCREMENT
            FROM
                (SELECT 0 UNITS UNION
                SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION
                SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION
                SELECT 7 UNION SELECT 8 UNION SELECT 9) UNITS
            CROSS JOIN
                (SELECT 0 TENS UNION
                SELECT 10 UNION SELECT 20 UNION SELECT 30 UNION
                SELECT 40 UNION SELECT 50 UNION SELECT 60 UNION
                SELECT 70 UNION SELECT 80 UNION SELECT 90) TENS
            CROSS JOIN
                (SELECT 0 HUNDREDS UNION
                SELECT 100 UNION SELECT 200 UNION SELECT 300 UNION
                SELECT 400 UNION SELECT 500 UNION SELECT 600 UNION
                SELECT 700 UNION SELECT 800 UNION SELECT 900) HUNDREDS
            ) INCREMENT
            -- For every year from 2001 to 2100, find the number of days in the year.
            , (SELECT
                YEAR
                , DAYOFYEAR(CONCAT(YEAR, '-12-31')) - DAYOFYEAR(CONCAT(YEAR, '-01-01')) + 1 DAYS
            FROM
                -- Generate years from 2001 to 2100.
                (SELECT
                    (2000 + UNITS + TENS) YEAR
                FROM
                    (SELECT 0 UNITS UNION
                    SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION
                    SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION
                    SELECT 7 UNION SELECT 8 UNION SELECT 9) UNITS
                CROSS JOIN
                    (SELECT 0 TENS UNION
                    SELECT 10 UNION SELECT 20 UNION SELECT 30 UNION
                    SELECT 40 UNION SELECT 50 UNION SELECT 60 UNION
                    SELECT 70 UNION SELECT 80 UNION SELECT 90) TENS
                ) YEAR
            WHERE
                YEAR BETWEEN 2001 AND 2100
            ) YEAR
          WHERE
              INCREMENT BETWEEN 0 AND DAYS - 1
          ORDER BY
              YEAR
              , INCREMENT) DATE;
    

    On my local MySQL database, the INSERT query took just a few seconds. Hope this helps someone.

提交回复
热议问题