更新特定日期的数据库记录

问题描述 投票:2回答:1

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

mysql database events cron
1个回答
2
投票

如果系统管理允许您使用任一设施,则可以在任何特定时间设置事件或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值,就会使用建议的查询。

专家提示。如果你想在特定日子的最后一刻<=做一些事情,那么你最好在第二天的第一时刻在<做这件事。也就是说,为了获得最佳效果

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

代替

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

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

© www.soinside.com 2019 - 2024. All rights reserved.