【发布时间】:2015-12-24 16:02:02
【问题描述】:
我花了一整天的时间试图让它工作。
我有一个基于出现类型对日期执行计算的程序。它从 SELECT 中返回两个新的日期时间字段。
我想使用此过程来更新事件表。像这样。
UPDATE
events
SET
start = new_start,
end = new_end
FROM CALL updateEvents(events.occurance, events.day_num, start, end)
WHERE
end < NOW();
我正在使用 MySQL 工作台,但它报告“FROM”在此位置不是有效输入。
这是程序。
CREATE DEFINER=`admin`@`%` PROCEDURE `updateEvents`(occurance VARCHAR(20), day_num INT, start_time DATETIME, end_time DATETIME)
BEGIN
DECLARE time_interval INT;
DECLARE new_start DATETIME;
DECLARE last_day DATETIME;
DECLARE last_hours INT;
SET time_interval = UNIX_TIMESTAMP(end_time) - UNIX_TIMESTAMP(start_time);
SET last_hours = UNIX_TIMESTAMP(start_time) - UNIX_TIMESTAMP(DATE(start_time));
SET last_day = FROM_UNIXTIME(UNIX_TIMESTAMP(LAST_DAY(start_time)) + last_hours, "%Y-%m-%d %H:%i:%s");
SET new_start =
CASE occurance
WHEN 'daily' THEN DATE_ADD(start_time, INTERVAL 1 DAY)
WHEN 'weekly' THEN DATE_ADD(start_time, INTERVAL 1 WEEK)
WHEN 'monthly' THEN DATE_ADD(start_time, INTERVAL 1 MONTH)
WHEN 'bimonthly' THEN DATE_ADD(start_time, INTERVAL 2 MONTH)
WHEN 'quarterly' THEN DATE_ADD(start_time, INTERVAL 1 QUARTER)
WHEN 'firstof' THEN
CASE
WHEN DATE_ADD(DATE_FORMAT(start_time, '%Y-%m-01 %H:$i:$s'), INTERVAL (7+day_num - WEEKDAY(DATE_FORMAT(start_time, '%Y-%m-01 %H:$i:$s')))%7 DAY) > start_time
THEN DATE_ADD(DATE_FORMAT(start_time, '%Y-%m-01 %H:$i:$s'), INTERVAL (7+day_num - WEEKDAY(DATE_FORMAT(start_time, '%Y-%m-01 %H:$i:$s')))%7 DAY)
ELSE DATE_ADD(DATE_FORMAT(DATE_ADD(start_time, INTERVAL 1 MONTH), '%Y-%m-01 %H:$i:$s'), INTERVAL (7+day_num - WEEKDAY(DATE_FORMAT(DATE_ADD(start_time, INTERVAL 1 MONTH), '%Y-%m-01 %H:$i:$s')))%7 DAY)
END
WHEN 'secondof' THEN
CASE
WHEN DATE_ADD(DATE_FORMAT(start_time, '%Y-%m-01 %H:$i:$s'), INTERVAL (7+day_num - WEEKDAY(DATE_FORMAT(start_time, '%Y-%m-01 %H:$i:$s')))%14 DAY) > start_time
THEN DATE_ADD(DATE_FORMAT(start_time, '%Y-%m-01 %H:$i:$s'), INTERVAL (7+day_num - WEEKDAY(DATE_FORMAT(start_time, '%Y-%m-01 %H:$i:$s')))%14 DAY)
ELSE DATE_ADD(DATE_FORMAT(DATE_ADD(start_time, INTERVAL 1 MONTH), '%Y-%m-01 %H:$i:$s'), INTERVAL (7+day_num - WEEKDAY(DATE_FORMAT(DATE_ADD(start_time, INTERVAL 1 MONTH), '%Y-%m-01 %H:$i:$s')))%14 DAY)
END
WHEN 'lastof' THEN
CASE
WHEN DATE_SUB(last_day, INTERVAL ((WEEKDAY(last_day)+7-day_num))%7 DAY) > start_time
THEN DATE_SUB(last_day, INTERVAL ((WEEKDAY(last_day)+7-day_num))%7 DAY)
ELSE DATE_SUB(DATE_ADD(last_day, INTERVAL 1 MONTH), INTERVAL ((WEEKDAY(DATE_ADD(last_day, INTERVAL 1 MONTH))+7-day_num))%7 DAY)
END
ELSE
start_time
END;
SELECT
new_start,
FROM_UNIXTIME(UNIX_TIMESTAMP(new_start) + time_interval,"%Y-%m-%d %H:%i:%s") AS new_end;
END
PS。请原谅我的拼写错误。
【问题讨论】: