請通過每個記錄循環,增加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