MySql如何从一个区间生成完整的日历?

Key*_*See 5 php mysql sql

我是 mysql 程序的新手。我请求你帮助使用某种程序生成日历(在一定间隔内每天生成一行)...在 stackoverflow 上我发现了这个函数:

CREATE PROCEDURE filldates(dateStart DATE, dateEnd DATE)
    BEGIN

          WHILE dateStart <= dateEnd DO
            INSERT INTO mytable (mydate) VALUES (dateStart);
            SET dateStart = date_add(dateStart, INTERVAL 1 DAY);
          END WHILE;
        END;


    CALL filldates('2014-01-01','2014-12-31');
Run Code Online (Sandbox Code Playgroud)

INSERT INTO mytable (mydate) VALUES (dateStart);但在我使用MySql 5.5.35-33附近出现错误,我将在 PhpMyAdmin 上运行查询。我单独尝试了查询,但它按预期工作。一个 php 解决方案也可以...还有某种要导入的 .sql 文件生成器等,谢谢:D

结果一定类似于该表:

  ID | Date       | Price | ..
______________________________
   0 | 2014-01-01 |   40  | ..
   1 | 2014-01-02 |   40  | ..
   2 | 2014-01-03 |   40  | ..
 ... |    ...     |  ...  |
 365 | 2014-12-31 |   40  | ..
Run Code Online (Sandbox Code Playgroud)

如果您知道如何生成这种表格,我将非常感激

其他mysql信息

innodb_version : 5.5.35-rel33.0
protocol_version : 10
slave_type_conversions 
version : 5.5.35-33.0-log
version_comment: Percona Server (GPL), Release rel33.0, Revision 61...
version_compile_machine : x86_64
version_compile_os : Linux
Run Code Online (Sandbox Code Playgroud)

VMa*_*Mai 5

假设你的表至少有这样的CREATE TABLE语句:

CREATE mytable(
  ID INT,
  date DATE,
  Price INT
);
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下语句插入一年中的每一天的行:

INSERT INTO mytable (ID, date, Price)
SELECT
    t.n, 
    DATE_ADD('2014-01-01', INTERVAL t.n DAY),
    40
FROM (
    SELECT 
        a.N + b.N * 10 + c.N * 100 AS n
    FROM
        (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
       ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
       ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) c
    ORDER BY n
) t   
WHERE
    t.n <= TIMESTAMPDIFF(DAY, '2014-01-01', '2014-12-31');
Run Code Online (Sandbox Code Playgroud)

演示

解释

子选择创建一个临时表,其中包含开始 ('2014-01-01') 和结束 ('2014-12-31') 之间的每一天的行。因此MySQL只需执行一次INSERT,这比逐行插入要快得多。

如果您只需要日期,请忽略我从您的示例中获取的ID列:Price

INSERT INTO mytable (date)
SELECT
    DATE_ADD('2014-01-01', INTERVAL t.n DAY)
FROM (
    SELECT 
        a.N + b.N * 10 + c.N * 100 AS n
    FROM
        (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
       ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
       ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7) c
    ORDER BY n
) t   
WHERE
    t.n <= TIMESTAMPDIFF(DAY, '2014-01-01', '2014-12-31');
Run Code Online (Sandbox Code Playgroud)

  • 我的错,我通过删除不需要的列留下了逗号,与第一次尝试相同的错误。现已更正。是时候去睡觉了! (2认同)