如果 mysql/mariadb 中的日期早于 1 小时,请更改列值?

Posted

技术标签:

【中文标题】如果 mysql/mariadb 中的日期早于 1 小时,请更改列值?【英文标题】:Change column value if date is older than 1 hour in mysql/mariadb? 【发布时间】:2020-12-20 21:43:07 【问题描述】:

假设我有下面的 SQL 表:

+------------+---------------------+
|  Status    |   Date              |
 ------------+---------------------+
|  Available | 2020-12-19 18:03:42 |
+------------+---------------------+

基本上我希望 mysql 每 3 分钟检查一次 Date 列,如果 Date 值早于 1 小时,我想将 Status 更改为 Offline。我们可以在 SQL 中实现这样的事情吗?或者,如果 Django python 中有更简单的解决方案,我也愿意使用它。

【问题讨论】:

如果您想通过 My SQL 执行此操作,我认为您应该考虑创建一个存储过程,然后安排它每 3 分钟运行一次。 你为什么要这样做? 【参考方案1】:

我建议这样做有一个视图:

create view v_t as
    select (case when date + interval 1 hour < current_timestamp then 'Offline'
                 else status
            end) as status,
           . . .   -- whatever other columns you have here
    from t;

视图具有以下优点:

值自动正确。视图的用户将在一小时后看到'Offline' 状态。 更改数据没有开销。 即使整个系统出现故障然后又重新启动,这仍然有效。

您实际上可以在闲暇时设置状态 - 比如说每天或每周在下班时间运行一次的工作。

【讨论】:

我后来将除t之外的查询复制粘贴到我的表中,但状态值从未改变,即使日期值是2020-12-18 19:40:33 哦,我终于可以select * from v_t 来查看状态了。谢谢你的工作:)【参考方案2】:

您可以在单个语句中检查和更新状态:

update mytable set status = 'Offline'
where date < current_timestamp - interval 1 hour;

现在我们需要安排查询定期执行。为此,通常会使用MySQL's event scheduler:

create event event_update_status
on schedule every 3 minute
starts current_timestamp
ends current_timestamp + interval 1 day
do
    update mytable set status = 'Offline'
    where date < current_timestamp - interval 1 hour;

【讨论】:

如果我直接执行update,它可以工作,但似乎连调度程序都没有工作 @MorariJan:运行create event 语句时会发生什么?

以上是关于如果 mysql/mariadb 中的日期早于 1 小时,请更改列值?的主要内容,如果未能解决你的问题,请参考以下文章

如果日期早于当前月份,则将日期转换为当前月份的第一天

如何选择特定日期是不是早于 X 年? - 快速 SQL

带有手动输入和动态最小日期的 jQuery UI 日期选择器

删除 zip 存档中“早于”的文件

是否可以按主键的一部分对 DQL 查询进行分组并返回具有 max() 日期时间记录(早于参考日期)的记录?

csharp 确保结束日期不早于开始日期。