为范围内的每个日期插入行

时间:2014-08-06 18:43:46

标签: php mysql sql

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

有什么方法可以实现这个目标吗?

谢谢!

2 个答案:

答案 0 :(得分:4)

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

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');

<强>解释

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

答案 1 :(得分:1)

DECLARE @StartDate DATE ='7/1/2014'

DECLARE @EndDate DATE ='2015年7月1日'

CREATE TABLE #TempTable

MyDate DATE,

MyStatus INT,

MyData INT,

MyData2 VARCHAR(5)

WHILE(@StartDate&lt; = @EndDate)

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