MySQL Event Scheduler на определенное время каждый день

Вот мой запрос

CREATE EVENT reset  ON SCHEDULE AT TIMESTAMP  DO UPDATE `ndic`.`students` SET `status` =  '0';  

Как я могу обновлять статус до «0» в 13:00 каждый день. Что я должен поставить вместо TIMESTAMP?

30
задан 14.05.2020, 17:25

6 ответов

Документация по 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;

В клиенте MySQL командной строки вы можете:

SHOW EVENTS;

Здесь перечислены каждое событие с его метаданными, например, если оно должно выполняться только один раз или повторяться.

Вторая проблема: указание повторяющегося события на определенный элемент расписания .

Испытывая различные виды выражения, мы можем придумать что-то вроде:

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;
32
ответ дан 14.05.2020, 17:26
  • 1
    Обратите внимание на то, что эта функция не будет работать из поля над PHP7, который бросает ошибку, когда индекс массива отсутствует. You' ll должны добавить надлежащие проверки isset – Pepijn Olivier 04.06.2017, 02:27
  • 2
    Этот doesn' t работают на меня. Я попробовал 10 DAY_HOUR, и это просто сразу выполнилось и запланировало себя. И при этом я не вижу, почему это было бы. Когда я прочитал документы MySQL, DAY_HOUR является способом определить дни и часы с этого времени - это - все еще интервал. Или я полностью неправильно понял? – Adam 14.05.2020, 17:26

Это может быть слишком поздно для вашей работы, но вот как я это сделал. Я хочу, чтобы что-то запускалось каждый день в 1:00 - я думаю, это похоже на то, что вы делаете. Вот как я это сделал:

CREATE EVENT event_name
  ON SCHEDULE
    EVERY 1 DAY
    STARTS (TIMESTAMP(CURRENT_DATE) + INTERVAL 1 DAY + INTERVAL 1 HOUR)
  DO
    # Your awesome query
32
ответ дан 14.05.2020, 17:26
  • 1
    @calumbrodie Ваши тестовые сценарии, кажется, хорошо работают здесь! – Pepijn Olivier 04.06.2017, 02:26

Мой вариант использования аналогичен, за исключением того, что я хочу, чтобы событие очистки журнала запускалось в 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 
15
ответ дан 14.05.2020, 17:27
  • 1
    Эта функция довольно ошибочна, пробегая различные тестовые сценарии, которыми она сталкивается прочь, каждый выходит на индексах. (данные тестирования в качестве примера: $array = [1, 5, 10]; $value = 2 или $array = [0.34, 0.5, 0.9, 1.9, 18.6]; $value = 0.89) – calumbrodie 27.07.2016, 17:11
  • 2
    Couldn' t Вы используют CURRENT_DATE() вместо str_to_date( date_format(now(), '%Y%m%d 0200'), '%Y%m%d %H%i' )? Так или иначе спасибо. – Linus 14.05.2020, 17:28
  • 3
    Да - за исключением того, что я хочу быть в состоянии определить, что это достигает 0200 каждый день. При использовании current_date тогда, он работал бы каждый день в любое время, Вы, оказалось, выполняли сценарий для создания его. – Adam 14.05.2020, 17:28
  • 4
    О, я думал, что CURRENT_DATE возвратил дату с форматом: yyyy-MM-dd, означающий, что время было бы 0:00, но возможно мной wasn' t право. – Linus 14.05.2020, 17:28
  • 5
    Мои извинения. Вы были правы. Я перепутывал свои реализации SQL - я также работаю с Oracle pl/sql, и там current_date является объектом даты, содержащим текущую дату и время в пользовательском часовом поясе - больше как MySQLs теперь (). Таким образом да, если бы Вы хотите его, достигают 0000 тогда curent_date, вероятно, работал бы. Если Вы хотите определить время ir выполнения каждый день, однако, то Вам нужно мое решение выше. – Adam 14.05.2020, 17:29
  • 6
    ах, хороший для знания. Не собираясь быть придирчивыми, но Вы могли на самом деле сделать что-то вроде этого (CURRENT_DATE() + INTERVAL X HOUR) + INTERVAL 1 DAY, но как Вы сказали, с Oracle это не могло бы работать то же. Спасибо за информацию. – Linus 14.05.2020, 17:29
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;

¡ВАЖНО! ->

SET GLOBAL event_scheduler = ON;
11
ответ дан 14.05.2020, 17:28
  • 1
    @MjrKusanagi array_numeric_sorted_nearest является основной функцией, но необходимо отсортировать массив перед использованием это – Peter 16.05.2014, 08:21
  • 2
    также добавьте объяснение если it' s возможный.. – Yohanes Khosiawan 许先汉 14.05.2020, 17:28
  • 3
    УСТАНОВИТЕ ГЛОБАЛЬНЫЙ event_scheduler = НА;-> используемый для активации mysql событий, если не созданный, но не выполненный когда-либо. dev.mysql.com/doc/refman/5.1/en/events-configuration.html – mercu 14.05.2020, 17:29

Попробуйте это

CREATE EVENT event1
ON SCHEDULE EVERY '1' DAY
STARTS '2012-04-17 13:00:00' -- should be in the future
DO
-- your statements
END
9
ответ дан 14.05.2020, 17:28
  • 1
    должен восхититься как someone' s мозг соединен проводом таким способом как для предложения функции как этот за 4 минуты – Robert Sinclair 08.01.2019, 14:06
CREATE EVENT test_event_03
ON SCHEDULE EVERY 1 MINUTE
STARTS CURRENT_TIMESTAMP
ENDS CURRENT_TIMESTAMP + INTERVAL 1 HOUR
DO
   INSERT INTO messages(message,created_at)
   VALUES('Test MySQL recurring Event',NOW());
1
ответ дан 14.05.2020, 17:29
  • 1
    Извините за заглядывание на этом старом ответе, но у меня, кажется, есть проблемы, если отрицательные числа используются, какие-либо предложения? – webaholik 08.10.2016, 11:34

Теги

Похожие вопросы