将varchar中的时间转换为integer中的秒的触发器是插入多行,而它应该只插入多行

x8goxv8g  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(267)

现在,事情是这样的:
当我在tbl\u中插入一行time1和time2的值时,我的触发器会在tbl\u b中插入两个不同的行,每列一行,当它应该插入一行time1和time2的值时。
此触发器的目的是将varchar列中导入的时间数据转换为整数列中的秒数。关键是导入的数据可以是10:00或1000:00。
虽然我意识到有一种更简单的方法可以做到这一点,但我真的很想知道这段代码有什么问题。
提前谢谢!

DELIMITER $$
CREATE TRIGGER  tr_one
AFTER INSERT ON tbl_a
FOR EACH ROW 
BEGIN
    IF CHAR_LENGTH(NEW.time1) = 5 THEN 
        INSERT INTO tbl_b(time1) VALUES((((SUBSTRING(NEW.time1, 1, 5) * 60) + SUBSTRING(NEW.time1, 7, 2)) * 60));
        END IF;

    IF CHAR_LENGTH(NEW.time2) = 5 THEN 
        INSERT INTO tbl_b (time2) VALUES (((SUBSTRING(NEW.time2, 1, 5) * 60) + SUBSTRING(NEW.time2, 7, 2)) * 60);
    END IF;
END
$$
w80xi6nr

w80xi6nr1#

你得到两行,因为你做了两个插入。您需要做的是找出这两个新值是什么,然后同时插入这两个值。这应该是你想要的:

DELIMITER $$
CREATE TRIGGER tr_one
AFTER INSERT ON tbl_a
FOR EACH ROW 
BEGIN
    DECLARE t1 VARCHAR(10) DEFAULT NEW.time1;
    DECLARE t2 VARCHAR(10) DEFAULT NEW.time2;
    DECLARE c INT;
    SET c = LOCATE(':', t1);
    IF c > 0 THEN
        SET t1 = (SUBSTRING(t1, 1, c-1) * 60 + SUBSTRING(t1, c+1)) * 60;
    END IF;
    SET c = LOCATE(':', t2);
    IF c > 0 THEN 
        SET t2 = (SUBSTRING(t2, 1, c-1) * 60 + SUBSTRING(t2, c+1)) * 60;
    END IF;
    INSERT INTO tbl_b (time1, time2) VALUES (t1, t2);
END
$$

注意,通过实际搜索 : 在小时和分钟值之间,并使用该值控制子字符串选择。

相关问题