【问题标题】:How to increment the date in MySql inside the while loop?如何在while循环内增加MySql中的日期?
【发布时间】:2021-12-12 18:24:11
【问题描述】:

我想使用 while 循环一一更新日期。日期应该增加一天,但我的代码没有执行此任务。我要更新的表是 Session 表,它有复合 PK (Code+Date) ,所以我想更新这个日期和 PK 的其他部分代码 正在引用模块表中的 代码。 这是生成表格的脚本

CREATE TABLE course (
    `code` CHAR(3) NOT NULL,
    `name` VARCHAR(30) NOT NULL,
    credits TINYINT NOT NULL,
    CONSTRAINT course_code PRIMARY KEY(`code`));
    
CREATE TABLE module (
    `code` CHAR(2) NOT NULL,
    `name` VARCHAR(30) NOT NULL,
    cost DECIMAL(8,2) NOT NULL,
    credits TINYINT NOT NULL,
    course_code CHAR(3) NOT NULL,
    CONSTRAINT module_code PRIMARY KEY(code),
    CONSTRAINT F_code FOREIGN KEY (`course_code`) 
      REFERENCES course (`code`) 
       ON DELETE CASCADE 
       ON UPDATE CASCADE);
     
CREATE TABLE session (
    `code` CHAR(2) NOT NULL,
    `date` DATE NOT NULL,
    room VARCHAR(30) NULL,
    CONSTRAINT code_date_PK PRIMARY KEY(code, date),
    CONSTRAINT F_session FOREIGN KEY (`code`) 
      REFERENCES module(`code`) 
       ON DELETE CASCADE 
       ON UPDATE CASCADE); 
INSERT INTO course (`code`,`name`, credits) VALUES
('WSD', 'Web Systems Development', 75),
('DDM', 'Database Design & Management', 100),
('NSF', 'Network Security & Forensics', 75);

INSERT INTO module (`code`, `name`, cost, credits, course_code) VALUES
('A2', 'ASP.NET', 250, 25, 'WSD'),
('A3', 'PHP', 250, 25, 'WSD'),
('A4', 'JavaFX', 350, 25, 'WSD'),
('B2', 'Oracle', 750, 50, 'DDM'),
('B3', 'SQLS', 750, 50, 'DDM');

INSERT INTO `session` (`code`, `date`, room) VALUES
('A2', '2021.06.05', 305),
('A3', '2021.06.06', 307),
('A4', '2021.06.07', 208),
('B2', '2021.08.22', 208),
('B3', '2021.08.23', 303),
('A2', '2022.05.01', 303),
('A3', '2022.05.02', 305);

喜欢

  • 2021-06-05
  • 2021-06-07
  • 2021-06-08
  • 2021-06-09

这是我的 SP 代码

CREATE PROCEDURE Modify_Schedule_5(IN courseCode Varchar(30), IN startDate date)
BEGIN

DECLARE loopCounter int;
DECLARE startDateCounter date;

SET loopCounter=(SELECT COUNT(*) from session);
SET startDateCounter=DATE_ADD(startDate, INTERVAL 1 day);

WHILE loopCounter>0 DO
UPDATE module m INNER JOIN session s on m.code=s.code
SET s.date=startDateCounter
where m.course_code=courseCode;
SET loopCounter=loopCounter-1;
SET startDateCounter=DATE_ADD(startDateCounter, INTERVAL 1 day);
END WHILE;

END $$
DELIMITER ; 

非常感谢

【问题讨论】:

  • 代码看起来不错,请添加示例数据来证明您的断言。
  • @P.Salmon 是的,一切都很好
  • 那么请删除问题..
  • @P.Salmon 我的意思是代码看起来不错,但为什么它不增加日期。
  • 日期确实增加了,但更新的行为可能与您认为的不一样,请将示例数据和预期结果作为文本添加到问题中。

标签: mysql stored-procedures


【解决方案1】:

不确定示例数据是否具有代表性,但问题暗示您希望在代码中一次通过会话 1 行,并且一次更新 1 行的日期顺序。您可以通过将要更新的行的详细信息存储在变量中来做到这一点 例如

delimiter $$
CREATE PROCEDURE p(IN courseCode Varchar(30), IN startDate date)
BEGIN

DECLARE loopCounter int;
DECLARE startDateCounter date;
declare voffset int default 0;
declare vcode varchar(4);
declare vdate date;

SET loopCounter=(SELECT COUNT(*) from session);
SET startDateCounter=DATE_ADD(startDate, INTERVAL 1 day);

WHILE loopCounter>0 DO
#select startdatecounter;
    select s.code,s.date into vcode,vdate 
    from module m 
    join session s on m.code = s.code 
    where m.course_code = coursecode 
    order by s.code,s.date limit voffset,1;
#select vcode,vdate;
    UPDATE module m INNER JOIN session s on m.code=s.code 
        SET s.date=startDateCounter
        where m.course_code=courseCode and s.code = vcode and s.date = vdate;

    sET loopCounter=loopCounter-1;
    SET startDateCounter=DATE_ADD(startDateCounter, INTERVAL 1 day);
    set voffset = voffset + 1;
END WHILE;

END $$
DELIMITER ; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-26
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    • 2017-06-19
    相关资源
    最近更新 更多