【问题标题】:Update using a procedure in MySQL使用 MySQL 中的过程进行更新
【发布时间】: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。请原谅我的拼写错误。

【问题讨论】:

    标签: mysql stored-procedures


    【解决方案1】:

    我想你正在寻找这个:Can a stored procedure/function return a table?

    您必须在过程中编写 UPDATE 语句... 祝你好运

    【讨论】:

      猜你喜欢
      • 2011-10-11
      • 1970-01-01
      • 2021-12-10
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      • 2017-05-27
      相关资源
      最近更新 更多