MySQL触发当今天's日期匹配到期日期


MySQL trigger when today's date matches due date

我正在开发一个应用程序在CakePHP 2.4.7

我有我的MySQL数据库,当系统的日期和小时与我在表中的截止日期匹配时,我已经认识到触发更新的必要性。

我使用的表如下

CREATE TABLE applied_surveys (id CHAR(36) NOT NULL PRIMARY KEY,
                        display_name VARCHAR(200),
                        area_id CHAR(36) NOT NULL,
                        survey_id CHAR(36) NOT NULL,
                        system_user_id CHAR(36) NOT NULL,
                        code VARCHAR(50),
                        init_date DATE,
                        due_date DATE,
                        init_hour TIME,
                        due_hour TIME,
                        completed INT,
                        state TINYINT DEFAULT 1,
                        max_responders INT,
                        created DATE, modified DATE,
                        FOREIGN KEY (area_id) REFERENCES areas(id),
                        FOREIGN KEY (survey_id) REFERENCES surveys(id),
                        FOREIGN KEY (system_user_id) REFERENCES system_users(id));

正如你所看到的,我使用了初始化日期/小时和到期日期/小时。我的目的是添加一个调查,并设定一个截止日期。当到达截止日期和时间时,系统必须将我的状态(状态)值更改为0,这意味着调查已经结束。

我将这个数据库集成到一个CakePHP应用程序,但我不太确定我应该在哪里为这种情况编程逻辑。

您不一定需要更新列,您可以在查询表时简单地返回当前系统日期和时间与due_date和due_time的比较。

将due_date和due_hour分隔为两个单独的列似乎有点奇怪,如果我们假设这两个列都不是null,我们可以将它们转换为DATETIME,然后与NOW()

进行比较

SELECT NOW() <= CONCAT(s.due_date,' ',s.due_hour) AS `state`
  FROM applied_surveys s

当一行被修改时,MySQL行触发器被触发。当系统时钟前进时,MySQL触发器不会被触发。

你可以运行一个UPDATE语句来标识你想要更新的行,例如

UPDATE applied_surveys s
   SET s.state = 0 
 WHERE NOW() >= CONCAT(s.due_date,' ',s.due_hour)
   AND NOT (s.state <=> 0)

你不能写" system ",它是system。

您将需要每秒钟/每分钟/每小时或任何您喜欢的时间运行一个cron作业,它将检查每个记录,并查看哪些记录晚于系统日期。你不能指望它在日期完全相同的时候运行,特别是当你考虑到秒数的时候。

您可以在这里阅读有关CRON作业的信息:http://code.tutsplus.com/tutorials/managing-cron-jobs-with-php--net-19428

您可以使用事件而不是触发器。

存储过程只在直接调用时执行;当与表相关的事件(如插入、更新或删除事件)发生时,触发器执行,而事件可以一次或多次定期执行。

设置事件SET GLOBAL event_scheduler = ON;

 CREATE EVENT IF NOT EXISTS update_state
 ON SCHEDULE  EVERY  1 day
    DO
      Update applied_surveys 
      Set state= 0 
      where due_date < curdate();
      //similar condition can be added for hour.

查看模式

中的所有事件
SHOW EVENTS;