MySQL事件调度程序每天在特定时间

gin*_*gin 30 mysql events scheduler

这是我的查询

CREATE EVENT reset  ON SCHEDULE AT TIMESTAMP  DO UPDATE `ndic`.`students` SET `status` =  '0';  
Run Code Online (Sandbox Code Playgroud)

如何在每天下午1点将状态更新为"0".我该怎么做而不是TIMESTAMP?

小智 33

这对你的工作来说可能为时已晚,但这就是我如何做到的.我希望每天凌晨1点运行一些东西 - 我相信这与你正在做的事情类似.我是这样做的:

CREATE EVENT event_name
  ON SCHEDULE
    EVERY 1 DAY
    STARTS (TIMESTAMP(CURRENT_DATE) + INTERVAL 1 DAY + INTERVAL 1 HOUR)
  DO
    # Your awesome query
Run Code Online (Sandbox Code Playgroud)

  • "TIMESTAMP(CURRENT_DATE)"是必要的吗?似乎只使用`CURRENT_DATE + Interval ..` (3认同)
  • 这难以置信!我一直不知道“开始”是怎么计算的,直到我进行了咨询,然后我说:这意味着“明天00:01:00”……非常感谢! (2认同)

oll*_*lle 32

关于CREATE EVENT文档非常好,但需要一段时间才能做到正确.

你有两个问题,第一,使事件重复,第二,使它在每天13:00运行.

此示例创建一个重复发生的事件.

CREATE EVENT e_hourly
    ON SCHEDULE
      EVERY 1 HOUR
    COMMENT 'Clears out sessions table each hour.'
    DO
      DELETE FROM site_activity.sessions;
Run Code Online (Sandbox Code Playgroud)

在命令行MySQL客户端中,您可以:

SHOW EVENTS;
Run Code Online (Sandbox Code Playgroud)

这会列出每个事件及其元数据,例如它应该只运行一次,还是重复发生.

第二个问题:将定期事件指向特定的计划项目.

通过尝试不同类型的表达,我们可以提出如下:

CREATE EVENT IF NOT EXISTS `session_cleaner_event`
ON SCHEDULE
  EVERY 13 DAY_HOUR
  COMMENT 'Clean up sessions at 13:00 daily!'
  DO
    DELETE FROM site_activity.sessions;
Run Code Online (Sandbox Code Playgroud)

  • 这对我不起作用.我尝试了10天DAY_HOUR,它只是立即执行并安排自己.我也不明白为什么会这样.当我阅读MySQL文档时,DAY_HOUR是一种从现在开始指定日期和时间的方式 - 它仍然是一个间隔.还是我完全被误解了? (5认同)

Ada*_*dam 15

我的用例是类似的,除了我希望每天凌晨2点运行日志清理事件.正如我在上面的评论中所说,DAY_HOUR对我不起作用.在我的情况下,我真的不介意可能错过第一天(并且,鉴于它是在凌晨2点运行,明天凌晨2点几乎总是在下一个凌晨2点),所以我使用:

CREATE EVENT applog_clean_event
ON SCHEDULE 
    EVERY 1 DAY
    STARTS str_to_date( date_format(now(), '%Y%m%d 0200'), '%Y%m%d %H%i' ) + INTERVAL 1 DAY
COMMENT 'Test'
DO 
Run Code Online (Sandbox Code Playgroud)

  • 我的appologies.你是对的.我让我的SQL实现混淆了 - 我也使用Oracle pl/sql,current_date是一个日期对象,包含用户时区的当前日期和时间 - 更像是现在的MySQL().所以,是的,如果你想让它在0000运行,那么curent_date可能会起作用.但是,如果您想指定每天运行的时间,那么您需要我的解决方案. (2认同)
  • 啊,很高兴知道.不会挑剔,但你实际上可以做这样的事情`(CURRENT_DATE()+ INTERVAL X HOUR)+ INTERVAL 1 DAY`但正如你所说,使用Oracle它可能不会起作用.谢谢你的信息. (2认同)

mer*_*rcu 11

DROP EVENT IF EXISTS xxxEVENTxxx;
CREATE EVENT xxxEVENTxxx
  ON SCHEDULE
    EVERY 1 DAY
    STARTS (TIMESTAMP(CURRENT_DATE) + INTERVAL 1 DAY + INTERVAL 1 HOUR)
  DO
    --process;
Run Code Online (Sandbox Code Playgroud)

重要: - >

SET GLOBAL event_scheduler = ON;
Run Code Online (Sandbox Code Playgroud)


Nav*_*mar 10

试试这个

CREATE EVENT event1
ON SCHEDULE EVERY '1' DAY
STARTS '2012-04-17 13:00:00' -- should be in the future
DO
-- your statements
END
Run Code Online (Sandbox Code Playgroud)