【问题标题】:Update database record on a specific date在特定日期更新数据库记录
【发布时间】:2018-05-31 18:03:05
【问题描述】:

我在 MYSQL 数据库中有一个名为“dueDate”的属性。我想在11:59PM 更新到期日的记录。 有没有办法创建一个可以做到这一点的eventcronjob

【问题讨论】:

    标签: mysql database events cron


    【解决方案1】:

    如果您的系统管理允许您使用任一工具,您可以为任何特定时间设置事件或 cronjob。查找如何创建 MySQL 重复事件很容易。

    但这是处理业务规则中时间依赖性的一种脆弱方式。 “易碎”是什么意思?一方面,如果出现问题并且作业无法运行,那么您的业务规则就会被破坏并且需要修复。另一方面,cronjobs 和事件不会在一天中的确切时间运行,它们会在一天中的那个时间或之后运行。他们可能需要一段时间才能开始。

    因此,我建议您在查询中使用规则来执行您的业务规则。例如,假设您最初希望在到期日结束时将名为is_overdue 的列设置为1。相反,请使用这样的查询来计算您的 is_overdue 列。

       SELECT whatever, dueDate,
              IF(dueDate >= CURDATE() + INTERVAL 1 DAY, 1, 0) is_overdue
         FROM table ...
    

    这样做的好处是它始终是正确的,精确到毫秒,并且不依赖于脆弱的后台作业的运行。

    事件和 cronjobs 更适合用于清除过时的记录。例如,您可以通过在其中使用此类查询来删除任何已过期 30 天或更长时间的记录。

      DELETE FROM table WHERE dueDate <= CURDATE() - INTERVAL 30 DAY
    

    如果您的 cronjob / 事件在某一天未能运行,那么第二天的运行仍将正确地进行清理。

    编辑。这个建议的重点是计算时间相关列(示例中为is_expired)。如果您遵循此建议,则根本不会更新该表。相反,您将使用建议的查询每当您检索到is_expired 值。

    专业提示。当你想在某一天的最后一刻&lt;= 一次做某事时,你最好在第二天的第一刻&lt; 一次做。也就是说,为了获得最佳效果,请使用

       WHERE dueDate < '2017-11-17' + INTERVAL 1 DAY
    

    代替

       WHERE dueDate <= '2017-11-17 23:59:59' 
    

    为什么?一天的最后一刻很难准确表达,特别是如果您的系统计时使用亚秒级精度。但是一天的第一刻很容易准确表达。

    【讨论】:

    • 是否可以在 INSERT 语句而不是查询中添加规则?
    • 在查询中添加规则的要点是:查询在CURDATE() 反映的特定时间运行。您可以将规则构建到计算列(在最近的 MySQL 版本中)或视图中。但不是插入。
    • 在以下情况下添加此“SELECT whatever, dueDate, IF(dueDate >= CURDATE() + INTERVAL 1 DAY, 1, 0) is_overdue FROM table ...” 是一个好的解决方案吗?每天 11:59 运行一次?如果没有,我究竟需要在哪里添加此查询才能在到期日到达时更新记录?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 2021-08-02
    • 2018-10-04
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 2020-11-10
    相关资源
    最近更新 更多