Сравнение дат в триггере MYSQL - PullRequest
0 голосов
/ 15 октября 2019

Я создаю "перед вставкой" триггер. Что мне нужно сделать, это сравнить, если новая строка имеет разницу в 60 секунд (или 1 минуту) с последней строкой (с учетом времени).

Мой код следующий:

    CREATE TRIGGER before_insert_detection 
    BEFORE INSERT ON detection
    FOR EACH ROW
    BEGIN

         Declare oldDate date;
         Declare newDate date;
         Declare timediff int;

         SELECT DATE_DETECTION into oldDate
         FROM DETECTION ORDER BY DATE_DETECTION desc limit 1;

         SET newDate = NEW.DATE_DETECTION;
         SET timediff = (TIMESTAMPDIFF(SECOND, oldDate, newDate)) < 60;

         IF timediff = 1 
            THEN SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT = "Same detection less than a minute 
            ago";END IF; 
     END;;

Поэтому, если разница между двумя датами меньше минуты, timediff должен быть 1, а сообщение должно увеличиваться. Но этого не происходит ... Строки не вставляются, независимо от времени ...

Примеры вставок:

INSERT INTO DETECTION VALUES (1, '2019-10-15 12:00:01');

вставлено OK

INSERT INTO DETECTION VALUES (2, '2019-10-15 12:00:20');

вставлено OK, и это не должно произойти ...

Любая помощь?

Заранее спасибо !! :)

1 Ответ

1 голос
/ 15 октября 2019

Я не могу воспроизвести вашу проблему, если olddate и newdate определены как datetime.

 drop trigger if exists t;

drop table if exists t;
create table t(id int auto_increment primary key,date_detection datetime); 
delimiter $$
CREATE TRIGGER t 
    BEFORE INSERT ON t
    FOR EACH ROW
    BEGIN

         Declare oldDate datetime;
         Declare newDate datetime;
         Declare timediff int;

         SELECT DATE_DETECTION into oldDate
         FROM t ORDER BY DATE_DETECTION desc limit 1;

         SET newDate = NEW.DATE_DETECTION;
         SET timediff = (TIMESTAMPDIFF(SECOND, oldDate, newDate)) < 60;

         IF timediff = 1  THEN 
                SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT = 'Same detection less than a minute ago';

            END IF; 
     END $$

delimiter ;

MariaDB [sandbox]> set @olddate = '2019-10-15 12:00:01';
Query OK, 0 rows affected (0.00 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> insert into t (date_detection) values (@olddate);
ERROR 1643 (02000): Same detection less than a minute ago
MariaDB [sandbox]> set @newdate = '2019-10-15 12:00:20';
Query OK, 0 rows affected (0.01 sec)

MariaDB [sandbox]> insert into t (date_detection) values (@newdate);
ERROR 1643 (02000): Same detection less than a minute ago
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...