首页 > 解决方案 > 将mysql表的记录复制到下周

问题描述

我想根据具体情况将数据从 MySQL 表复制到下周。问题的示意图如下图所示。

问题的示意图

我的表由代表日历术语的记录组成,范围为 30 分钟。所有记录都从 H:00 或 H:30 开始。表的结构在以下脚本中给出(与给定图匹配):

CREATE TABLE Table1 (
  `id` INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  `field1` INTEGER,
  `flag` INTEGER,
  `startDate` VARCHAR(256),
  `endDate` VARCHAR(256)  
);

INSERT INTO Table1
  (`id`, `field1`, `flag`, `startDate`, `endDate`)
VALUES
(1,4,0,'2021-02-10 09:00:00','2021-02-10 09:30:00'),
(2,3,0,'2021-02-12 10:00:00','2021-02-12 10:30:00'),
(3,3,1,'2021-02-13 12:00:00','2021-02-13 12:30:00'),
(4,3,0,'2021-02-15 11:00:00','2021-02-15 11:30:00'),
(5,17,0,'2021-02-22 11:00:00','2021-02-22 11:30:00');

我想将一周的数据模式复制到下一周(没有递归调用,只有一份)。仅记录flag=0应复制的位置(仅绿色单元格)。如果在下周的同一学期中已经存在另一条记录,则应跳过该副本。是否跳过记录 N.4 的副本或覆盖下周记录实际上并不重要,但不能有两条记录共享相同的术语。因此,除startDate和之外的字段的值endDate并不重要。

小提琴

标签: phpmysql

解决方案


您可以尝试使用插入选择

INSERT INTO Table1
  (`id`, `field1`, `flag`, `startDate`, `endDate`)
select `id`, `field1`, `flag`, date_add(`startDate`, INTERVAL 7 DAY),  date_add(`endDate`, INTERVAL 7 DAY)
from Table1 
where flag=0

如果你想避免重复的行插入,你应该在 select 中添加 distinct 子句

INSERT INTO Table1
  (`id`, `field1`, `flag`, `startDate`, `endDate`)
select  DISTINCT `id`, `field1`, `flag`, date_add(`startDate`, INTERVAL 7 DAY),  date_add(`endDate`, INTERVAL 7 DAY)
from Table1 
where flag=0

对于重复的记录,您可能只需要没有目的地日期的记录

INSERT INTO Table1
  (`id`, `field1`, `flag`, `startDate`, `endDate`)
select `id`, `field1`, `flag`, date_add(`startDate`, INTERVAL 7 DAY),  date_add(`endDate`, INTERVAL 7 DAY)
from Table1 
where flag=0 
AND `startDate` <>date_add(`startDate`, INTERVAL 7 DAY)

推荐阅读