MySQL 查询填补数据空白

问题描述 投票:0回答:1

我正在管理一个存在一些问题的数据库,我被要求填补数据库无法读取已有数据的空白。因此,桌子传感器没有 2023 年 12 月 14 日至 2023 年 4 月 19 日之间的数据。我需要获取数据库中 2023 年 12 月 14 日之前 X 天的数据(X 是 2023 年 12 月 14 日和 2023 年 4 月 19 日之间的差值),并将该数据中的“日期”字段替换为日期2023 年 12 月 14 日后至 2023 年 4 月 19 日,同时保留其他字段。我试图向我们的朋友 ChatGPT 寻求帮助,他给了我这样的东西,这是一个开始,但远没有解决我的问题。

-- Step 1: Identify the start and end dates
SET @start_date = '2023-12-13';
SET @end_date = DATE_SUB(@start_date, INTERVAL 127 DAY);

-- Step 2: Retrieve data that exists before the start date
CREATE TEMPORARY TABLE PreviousData AS
SELECT *
FROM sensors
WHERE `date` <= @end_date;

-- Step 3: Construct the dynamic INSERT statement
SET @columns = (SELECT GROUP_CONCAT(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'sensors' AND COLUMN_NAME != 'date');
SET @sql = CONCAT('INSERT INTO sensors (`date`, ', @columns, ') ',
                  'SELECT DATE_ADD(\'', @start_date, '\', INTERVAL (t.n - 1) DAY), ', @columns, ' ',
                  'FROM (SELECT 1 AS n ', 
                          'UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION ',
                          'SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10) AS t ',
                  'LEFT JOIN PreviousData pd ON pd.`date` = DATE_ADD(\'', @start_date, '\', INTERVAL (t.n - 1) DAY) ',
                  'WHERE DATE_ADD(\'', @start_date, '\', INTERVAL (t.n - 1) DAY) BETWEEN \'', @start_date, '\' AND \'', DATE_SUB(@start_date, INTERVAL 127 DAY), '\' ',
                  'AND pd.`date` IS NOT NULL;');

-- Step 4: Execute the dynamic SQL statement
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

我认为 UNIONS 部分没有多大意义,至少现在是这样。 预先感谢!

sql mysql date datediff dateadd
1个回答
0
投票

我认为您要做的就是将较早的块复制到丢失的日期中。我认为你真的不需要临时表。你可以这样做:

insert into yourtable
select dt+127 dt,<all the other columns>
from yourtable
where dt between date'2023-12-14' - 127 and date'2023-12-14' - 1;

由于您使用的是 MySQl dt + 间隔 127 天,因此您需要添加天数,其他日期算术也类似。

© www.soinside.com 2019 - 2024. All rights reserved.