如果 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 小时,请更改列值?的主要内容,如果未能解决你的问题,请参考以下文章
带有手动输入和动态最小日期的 jQuery UI 日期选择器