【问题标题】:Insert row for each date within range为范围内的每个日期插入行
【发布时间】:2014-09-29 19:52:26
【问题描述】:

在我的 MySQL 数据库中,我想为特定日期范围(2014 年 7 月 1 日至 2015 年 7 月 1 日)内的每一天插入表行。每行都有一组不同的值,但只需要设置其中两个(日期和状态),其他值应保持为 NULL。

有什么方法可以实现吗?

谢谢!

【问题讨论】:

  • insert into foo (date, status, argle, bargle) values (now(), 'hungry', null, null)?

标签: php mysql sql


【解决方案1】:

声明@StartDate DATE = '7/1/2014'

声明@EndDate DATE = '7/1/2015'

创建表#TempTable

(

MyDate DATE,

MyStatus INT,

MyData INT,

MyData2 VARCHAR(5)

)

WHILE (@StartDate

BEGIN

    INSERT INTO #TempTable

            ( MyDate, MyStatus, MyData, MyData2 )

    VALUES  ( @StartDate, -- MyDate - date

          8, -- MyStatus - int

              NULL, -- MyData - int

              NULL  -- MyData2 - varchar(5)

              )

    SET @StartDate = DATEADD(DAY, 1, @StartDate)

END 

【讨论】:

    【解决方案2】:

    如果你想在这个范围内的每一天插入相同的状态,你可以使用:

    INSERT INTO your_table (date, status, col3, col4)
    SELECT
        DATE_ADD('2014-07-01', INTERVAL t.n DAY),
        'your status',
        NULL,
        NULL
    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-07-01', '2015-07-01');
    

    说明

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

    【讨论】:

    • 这就像一个魅力,而且非常快。不过,对于我的生活,我无法弄清楚子选择对所有这些 UNION 做了什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多