【问题标题】:How to create a event that automatically update the status after 10 days?如何创建一个 10 天后自动更新状态的事件?
【发布时间】:2018-03-23 11:37:37
【问题描述】:

我有 sent_date 和 proposal_status。 假设 sent_date 是 23/03/2018,proposal_status 是“Sent/Received”。

我想在 10 天后自动将状态更新为“已中止”(即 2018 年 3 月 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天后如何自动更新状态?

【问题讨论】:

标签: mysql


【解决方案1】:

您的 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 天。

【讨论】:

  • 我将其更改为该条件,但 1 分钟后没有任何更新
猜你喜欢
  • 1970-01-01
  • 2018-09-06
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
  • 2018-10-04
  • 2020-12-27
  • 2022-08-14
  • 2017-03-22
相关资源
最近更新 更多