我正在开发一个应用程序在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;