我有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天后自动更新状态? 任何帮助将受到高度赞赏..
答案 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天。