请通过每个记录循环,增加20
minutes
到对前一个记录的ScheduleTime
字段中的值尝试以下...
SET @workingScheduleTime := (SELECT DATE_ADD('2017-05-06 22:00:59', INTERVAL -20 MINUTE));
UPDATE TableName
JOIN (SELECT product_id,
CASE
WHEN TIME(DATE_ADD(@workingScheduleTime, INTERVAL 20 MINUTE)) NOT BETWEEN '05:00:01' and '22:29:59' THEN
@workingScheduleTime := DATE_ADD(TIMESTAMP(DATE(@workingScheduleTime), '05:00:01'), INTERVAL 1 DAY)
ELSE
@workingScheduleTime := DATE_ADD(@workingScheduleTime, INTERVAL 20 MINUTE)
END AS ScheduleTime
FROM TableName
) AS redatedList ON TableName.product_id = redatedList.product_id
SET TableName.ScheduleTime = redatedList.ScheduleTime;
此通过作品的解决方案。它还允许指定初始值ScheduleTime
。因此,我们需要开始工作值ScheduleTime
即20
minutes
之前我们的初始值,以便循环的第一次迭代将返回我们的初始值。因此,我的解决方案开始与声明...
SET @workingScheduleTime := (SELECT DATE_ADD('2017-05-06 22:00:59', INTERVAL -20 MINUTE));
随着我们的工作价值从而初始化我一直在使用基于在MySQL - UPDATE query based on SELECT Query发现Eric
的解决方案SELECT
语句实现表TableName
的UPDATE
。声明如下...
UPDATE TableName
JOIN (SELECT product_id,
CASE
WHEN TIME(DATE_ADD(@workingScheduleTime, INTERVAL 20 MINUTE)) NOT BETWEEN '05:00:01' and '22:29:59' THEN
@workingScheduleTime := DATE_ADD(TIMESTAMP(DATE(@workingScheduleTime), '05:00:01'), INTERVAL 1 DAY)
ELSE
@workingScheduleTime := DATE_ADD(@workingScheduleTime, INTERVAL 20 MINUTE)
END AS ScheduleTime
FROM TableName
) AS redatedList ON TableName.product_id = redatedList.product_id
SET TableName.ScheduleTime = redatedList.ScheduleTime;
本声明基于的product_id
他们共同的价值以下子查询的结果执行TableName
的INNER JOIN
之间的一个实例启动...
SELECT product_id,
CASE
WHEN TIME(DATE_ADD(@workingScheduleTime, INTERVAL 20 MINUTE)) NOT BETWEEN '05:00:01' and '22:29:59' THEN
@workingScheduleTime := DATE_ADD(TIMESTAMP(DATE(@workingScheduleTime), '05:00:01'), INTERVAL 1 DAY)
ELSE
@workingScheduleTime := DATE_ADD(@workingScheduleTime, INTERVAL 20 MINUTE)
END AS ScheduleTime
FROM TableName
这子查询为TableName
中的每个记录选择product_id
的值,然后检查工作值的下一个值是否将在发起人禁止的时间范围内发生为太晚/太早。如果确实如此,则CASE
声明选择下一个可接受的时间(第二天的05:00:01
)。如果被提名人的价值在可接受的时间范围内,则由CASE
声明选择。工作值更新
然后将CASE
语句选择的值选为子查询的新值ScheduleTime
。
如上所述,子查询的结果然后以这样的方式加入到TableName
中,使得每个现有记录TableName
有效地具有它附加的新值。 SET
声明使用此新建立的关系将每个现有值ScheduleTime
更改为其相应的新值。
这个答案对利用问题的CREATE
声明和填充使用下面的脚本创建数据测试...
INSERT INTO TableName (product_id,
ScheduleTime)
VALUES ('01', '2017-05-07 22:00:59'),
('02', '2017-05-07 09:09:59'),
('03', '2017-05-07 09:59:59'),
('04', '2017-05-07 09:49:59'),
('05', '2017-05-07 23:09:59'),
('06', '2017-05-07 23:09:59'),
('07', '2017-05-07 23:09:59'),
('08', '2017-05-07 23:09:59'),
('09', '2017-05-07 23:09:59'),
('10', '2017-05-07 23:09:59'),
('11', '2017-05-07 23:09:59'),
('12', '2017-05-07 23:09:59'),
('13', '2017-05-07 23:09:59'),
('14', '2017-05-07 23:09:59'),
('15', '2017-05-07 23:09:59'),
('16', '2017-05-07 23:09:59'),
('17', '2017-05-07 23:09:59'),
('18', '2017-05-07 23:09:59'),
('19', '2017-05-07 23:09:59'),
('20', '2017-05-07 23:09:59');
我的代码,结果被证实由提问者为宜。
进一步阅读
https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_between(对MySQL的BETWEEN
和NOT BETWEEN
运营商)
https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date(对MySQL的DATE()
功能)
https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-add(对MySQL的DATE_ADD()
功能)
https://dev.mysql.com/doc/refman/5.7/en/set-statement.html(上MySQL的的SET
语句)
https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_time(对MySQL的TIME()
功能)
https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_timestamp(对MySQL的TIMESTAMP()
功能)
https://dev.mysql.com/doc/refman/5.7/en/update.html(对MySQL的UPDATE
语句)
尝试'DATE_ADD(ScheduleTime,间隔的20分钟)'(注意'_')。请阅读https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-add。 – toonice
另外,“MI”是什么意思? – toonice
@toonice MI被静置分钟,当我使用'UPDATE数据库 SET ScheduleTime = DATE_ADD(ScheduleTime,INTERVAL 20 MINUTE) 其中CAST(ScheduleTime作为时间)<'22:30:00' 或CAST(ScheduleTime随着时间的)> = '05:00:00'; '它不会给我错误,但它也不会改变表中的任何内容 – Schwann