如何创建一个在10天后自动更新状态的事件?

时间:2018-03-23 11:37:37

标签: mysql

我有sent_date和proposal_status。 假设sent_date是23/03/2018并且proposal_status是"发送/接收"。

我想将状态更新为" Aborted" 10天后自动生成(即03年4月4日,状态应自动更改为已中止)。

我尝试的是:

CREATE EVENT reset ON SCHEDULE EVERY 10 day DO update barter_proposals set proposal_status="Aborted" WHERE DATE_ADD( sent_date, INTERVAL 10 day ) AND proposal_status = "Sent/Received"

暂时用于测试目的,我花了一分钟而不是一天:

CREATE EVENT reset ON SCHEDULE EVERY 1 MINUTE DO update barter_proposals set proposal_status="Aborted" WHERE DATE_ADD( sent_date, INTERVAL 1 MINUTE ) AND proposal_status = "Sent/Received"

我得到的结果立即中止,而不是1分钟后。它忽略了Date_ADD。 如何在10天后自动更新状态? 任何帮助将受到高度赞赏..

1 个答案:

答案 0 :(得分:0)

您在UPDATE查询中有此表达式。

WHERE DATE_ADD( sent_date, INTERVAL 10 day ) AND ...

你实际上想要与当前时间进行比较,就像这样。

WHERE DATE_ADD( sent_date, INTERVAL 10 day ) >= NOW() AND ...

MySQL有一个怪癖,即当数字出现在WHERE子句中时,它们会被强制转换为布尔值。任何非零都意味着真实。这就是为什么MySQL没有抱怨你使用DATETIME表达式而不将它与任何东西进行比较。

专业提示如果您采用格式化SQL的做法,这样您就不必滚动查看它,您会发现更容易进行故障排除。例如:

CREATE EVENT reset ON SCHEDULE EVERY 10 day DO 
    update barter_proposals 
       set proposal_status="Aborted"
     WHERE DATE_ADD( sent_date, INTERVAL 10 day ) >= NOW()
       AND proposal_status = "Sent/Received"

请注意。正如您所定义的那样,此事件每十天才会运行一次。因此,在此事件改变其状态之前,有些记录将长达20天。