mysql - 使用 Mysql 存储过程更新和插入表行

标签 mysql stored-procedures cursor

我有一个表 book_meetings,其中有 70000 条记录,我想将此数据迁移到另一个表中,对此进行很少的修改,为此我创建了一个 Mysql 存储过程。记录被插入到新表中,但值设置为空。 我仅从 book_meetings 表中选择四列,并希望将它们插入表中。

id int
date date
meet_at time
duration_in_hours decimal

我想要的是根据上述值计算start_dateend_date

例如:

if date ="2017-09-08" , meet_at is "09:00:00" and duration_in_hours is 1.5

那么start_date将为“2017-09-08 09:10:00”

end_date= start_date_duration_in_hour
end_date will be "2017-09-08 09:10:00"

start_date = concat date and meet_at 
end_date = start_date + duration_in_hours

and insert this values in new table

如果还有更好的想法请提出

CREATE PROCEDURE book_meetings8()
BEGIN
      -- Declare local variables
     DECLARE done BOOLEAN DEFAULT 0;
     DECLARE meet_at TIME;
     DECLARE start_date DATETIME;
     DECLARE tmp_date VARCHAR(255);
     DECLARE end_date DATETIME;
     DECLARE end_recurring_date DATE;
     DECLARE date1 DATE ;
     DECLARE id INTEGER(11);
     DECLARE duration DECIMAL(8,2);
     DECLARE minutes INTEGER(11);


    -- Declare the cursor
      DECLARE iter CURSOR
     FOR
       SELECT  id,date, meet_at,duration_in_hours FROM 
      book_meetings LIMIT 100;
   -- Declare continue handler
     DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;

  -- Open the cursor
     OPEN iter;
  -- Loop through all rows
     REPEAT
  -- Get order number

     FETCH iter INTO id,date1,meet_at,duration;
     SET minutes = duration  * 60;
     SET start_date = CAST(date1 as char) + " "+CAST(meet_at as 
    char);  
     SET end_date = CAST(start_date as datetime) + INTERVAL 
minutes MINUTE;     

    INSERT INTO 
  book_meetings_1(start_date,end_date)
  VALUES(start_date,end_date);
  -- End of loop
  UNTIL done END REPEAT;
 -- Close the cursor
 CLOSE iter;
  END;

最佳答案

我已经用单个 SQL 语句解决了上述问题(一次插入和更新所有记录,无需存储过程)

INSERT INTO temp_diary.book_meetings ( id,start_date,end_date) SELECT  id,CONCAT(`date`, ' ', `meet_at`) as start_date,DATE_ADD(concat(date,' ',meet_at), INTERVAL `duration_in_hours` HOUR) as end_date FROM  estate.book_meetings; 

关于mysql - 使用 Mysql 存储过程更新和插入表行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46175719/

相关文章:

android - 从 Android SQLite 中的多个表查询?

Mysql, Node ,查询中的查询,如何从另一个查询填充映射函数中的属性

mysql - 获取 MySQL 中分层类别的所有父级

mysql - 计算按用户分组的唯一天数

MySQL创建带分隔符的存储过程语法

apache-flex - 弹性 : How to set hand cursor?

mysql - 带 CaseBuilder 的 EnumPath(QueryDSL 3.6.2)

C# 数据库 ConnectionString 属性尚未初始化

sql-server - 使用 Case 或 Join 的 TSQL Select 语句

c++ - HCURSOR 从另一个窗口,可能吗?