当今日期与截止日期匹配时,MySQL会触发

时间:2014-06-20 20:31:10

标签: php mysql date cakephp triggers

我正在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应用程序中,但我不确定在哪种情况下我应该为这种情况编写逻辑。

3 个答案:

答案 0 :(得分:1)

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

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

e.g。

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)

答案 1 :(得分:0)

你不能写“sistem”,它是系统。

您需要每秒/分钟/小时运行一个cron作业,或者您喜欢的任何内容,这将检查每条记录,并查看哪些记录稍后而不是系统日期。您不能指望它在日期完全相同时正好运行,特别是如果您考虑秒数。

您可以在此处阅读有关CRON职位的信息:http://code.tutsplus.com/tutorials/managing-cron-jobs-with-php--net-19428

答案 2 :(得分:0)

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

仅在直接调用存储过程时才执行它;当与表关联的事件(例如插入,更新或删除事件)发生时,可以一次或多次定期执行该事件。

设置事件      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;