2015-09-24 1 views
1

Я хочу ОБНОВИТЬ мои данные в запланированное время. Моя проблема в том, что я не могу указать дату, которую я вводил в свою базу данных в текущую дату реального времени. Например, у меня есть 2015/24/9 19:50:00 в моей базе данных, теперь я хочу сопоставить ее с текущей датой реального времени, чтобы я мог обновить определенную строку в базе данных. Если я этого не сделаю, количество будет просто умножать 5 в каждой строке. Я хочу, чтобы умножить количество на 5 в конкретной строке и времяОбновление данных в MySQL в запланированное время

Код:

CREATE EVENT myeventsdasa11s 
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE 
ON COMPLETION PRESERVE 

DO 
    UPDATE messagesd 
    SET amount = amount*5 
    WHERE DATE = (the the current real time date); 

ответ

2

DATETIME и TIMESTAMP значение, как значения с плавающей точкой, трудно сравнивать численное равенство. Другими словами, если это произойдет, то NOW() = datetimestamp, это удачная случайность. Это особенно актуально при обработке событий: событие фактически начинает запускаться вскоре после запланированного времени.

Таким образом, вместо того, чтобы сказать что-то вроде этого

`DATE` = NOW() 

что-то вроде этого

`DATE` BETWEEN NOW() - INTERVAL 10 SECOND 
      AND NOW() + INTERVAL 10 SECOND 

Конечно, такой узкий интервал времени заставляет критически зависит от точности времени планировщика событий , Вам лучше добавить столбец LAST_UPDATED типа DATETIME в таблицу, а затем выполнить это обновление.

UPDATE messagesd 
    SET amount = amount * 5, 
     LAST_UPDATED = `DATE` 
WHERE `DATE` >= NOW() - INTERVAL 1 MINUTE 
    AND (`DATE` > LAST_UPDATED OR LAST_UPDATED IS NULL) 

Таким образом, каждый раз, когда ваше мероприятие проходит вы обновить все строки, которые из-за обновления, но еще не были обновлены. Это не в зависимости от точного времени запуска события. - INTERVAL 1 MINUTE позволяет событию быть на минуту поздним запуском и все еще функционирует правильно.

Если вам нужно запланировать другое обновление для будущего для определенной строки, измените значение столбца DATE, но не прикасайтесь к столбцу LAST_UPDATED.

+0

Это нормально, если мой столбец DATE является типом TIMESTAMP? –

+0

Да, вы можете использовать типы данных TIMESTAMP. Появятся те же проблемы, связанные с сравнением равенства. Убедитесь, что новый тип данных столбца 'LAST_UPDATED' соответствует типу данных столбца' DATE'. –

+0

LAST_UPDATED null? –

1

Вы просто ищете CURDATE()?

CREATE EVENT myeventsdasa11s 
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE 
ON COMPLETION PRESERVE 

DO 
    UPDATE messagesd 
    SET amount = amount * 5 
    WHERE DATE = CURDATE(); 
+0

попробовал то, что уже –

1

Если вам нужно текущего реальной дату время использования MySQL NOW()

CREATE EVENT myeventsdasa11s 
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE 
ON COMPLETION PRESERVE 

DO 
    UPDATE messagesd 
    SET amount = amount*5 
    WHERE DATE = NOW(); 
+0

тоже пробовал, какой тип данных должен быть на дате? –

+0

Дата столбца должна быть ** DATETIME ** тип –

+0

все еще не работает –

Смежные вопросы