DATE_ADD()具有TIME列类型以使记录过期

时间:2018-08-02 23:24:38

标签: mysql

我有两个表, KEY_TYPE USER_KEY

CREATE TABLE `KEY_TYPE` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `internal_name` varchar(16) NOT NULL,
  `expiration` time NOT NULL DEFAULT '00:00:00',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_application_internal_name` (`internal_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE `USER_KEY` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `uuid` char(36) NOT NULL,
  `key_type_id` int(11) NOT NULL,
  `CREATE_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我想{<1>}一个 USER_KEY ,一旦它 CREATE_DATE 加上 KEY_TYPE.expiration 大于DELETE 。我将设置一个 event 来完成此操作(假设这是最佳做法?)。但是,我不知道如何将时间数据类型到期时间列正确添加到 CREATE_DATE 列中。我想我已经接近了,但是NOW()却将 CREATE_DATE 添加了超过24小时。到目前为止,我的查询如下:

DATE_ADD

我一直在研究DB Fiddle和以下example

1 个答案:

答案 0 :(得分:1)

谢谢@ P.Salmon向我指出了正确的方向。我最终将INTERVAL SECOND更改为INTERVAL HOUR_SECOND,这似乎可以解决问题。

这是我最终遇到的事件:

SET GLOBAL event_scheduler = ON;
CREATE EVENT EVENT_EXPIRE_USER_KEYS
    ON SCHEDULE EVERY 1 HOUR STARTS CURRENT_TIMESTAMP
    DO
        DELETE USER_KEY
        FROM USER_KEY
        JOIN KEY_TYPE ON USER_KEY.key_type_id = KEY_TYPE.id
        WHERE  DATE_ADD(USER_KEY.create_date, INTERVAL KEY_TYPE.expiration HOUR_SECOND)  < NOW();

但这也可以:

SET GLOBAL event_scheduler = ON;
CREATE EVENT EVENT_EXPIRE_USER_KEYS
    ON SCHEDULE EVERY 1 HOUR STARTS CURRENT_TIMESTAMP
    DO
        DELETE USER_KEY
        FROM USER_KEY
        JOIN KEY_TYPE ON USER_KEY.key_type_id = KEY_TYPE.id
        WHERE  DATE_ADD(USER_KEY.create_date, INTERVAL TIME_TO_SEC(KEY_TYPE.expiration) SECOND)  < NOW();