Event not running properly - mysql

I need to create an automated event in MYSQL to update the status of orders to "Fulfilled" if current date is 2 days more than order date. My event needs to run once everyday.
Here is what I have created :
CREATE EVENT updorder
ON SCHEDULE EVERY 1 DAY
DO
update orders
set order_status = "Fulfilled"
where order_dt + INTERVAL 2 DAY < DATETIME
I also did this :
SET GLOBAL event_scheduler = ON;
SHOW PROCESSLIST
309 event_scheduler localhost NULL Daemon 125 Waiting for next activation NULL
What should I do to get this event to activate?

Your event is probably firing but not doing the intended UPDATE cause the below WHERE condition don't makes sense (DATETIME is a datatype)
where order_dt + INTERVAL 2 DAY < DATETIME
I think you meant to check less than current date time
where order_dt + INTERVAL 2 DAY < NOW()
(OR)
WHERE DATE_ADD(order_dt, INTERVAL 2 DAY) < NOW()

Related

Change column value if date is older than 1 hour in mysql/mariadb?

Say I have below SQL table:
+------------+---------------------+
| Status | Date |
------------+---------------------+
| Available | 2020-12-19 18:03:42 |
+------------+---------------------+
Basically I want MySQL to check the Date column every 3 minutes and if Date value is older than 1 hour, I want to change Status to Offline. Can we achieve such thing in SQL? Alternatively if there is easier solution in Django python, I am open to use that as well.
I would recommend doing this with a view:
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;
A view has the following advantages:
The value is automatically correct. Users of the view will see the 'Offline' status exactly after an hour.
There is no overhead on changing the data.
This works even if the entire system goes down and then comes back up.
You can actually set the status at your leisure -- say a job that runs once per day or per week at an off-time.
You can check and update the status in a single statement:
update mytable set status = 'Offline'
where date < current_timestamp - interval 1 hour;
Now we need to schedule the query to execute on a regular basis. For this, one would typically use 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;

MySQL EVENT does not execute

I have an event that deletes record on a table that are a month old. But it does not seem to execute.
DELIMITER $
CREATE EVENT delete_wykofile_back
ON SCHEDULE EVERY 1 MINUTE
STARTS CURRENT_TIMESTAMP + INTERVAL 1 DAY
ENDS CURRENT_TIMESTAMP + INTERVAL 5 YEAR
ON COMPLETION PRESERVE
DO
BEGIN
DELETE FROM factory.wyko_file_backup WHERE date_inserted < DATE_SUB(NOW(), INTERVAL 1 MONTH);
END$
DELIMITER ;
What I've done so far:
I have followed and set global event_scheduler to ON based from this question
I've also check this question, but to no avail.
There's also no answer from this question.
The account im using is a superuser based from this.
SHOW EVENTS;
SHOW PROCESSLIST;
I am using MySQL Workbench 6.2. I am running the event with 1 minute interval for testing.
STARTS CURRENT_TIMESTAMP + INTERVAL 1 DAY
needs to be the current date or a past date. Right now its set up to start on 12/4/2015.

Updating data in MySQL in scheduled time

I want to UPDATE my data in scheduled time. My problem is that I cant equal the date that I enter in my database in the current real time date. For example, I have 2015/24/9 19:50:00 in my database, now I want to equal it to the current real time date so that I can update a specific row in the database. If I don't do that, the amount field will just multiply 5 in every row. I want to multiply the amount by 5 in a specific row and time
Code:
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);
DATETIME and TIMESTAMP values are, like floating-point values, difficult to compare for numerical equality. In other words, if it happens that NOW() = datetimestamp, it's a lucky accident. This is especially true when processing events: the event actually starts to run shortly after the scheduled time.
So, instead of saying something like this
`DATE` = NOW()
say something like this
`DATE` BETWEEN NOW() - INTERVAL 10 SECOND
AND NOW() + INTERVAL 10 SECOND
Of course, such a narrow time interval makes you critically dependent on the time accuracy of the event scheduler. You'd be better off adding a LAST_UPDATED column of DATETIME type to your table, then doing this update.
UPDATE messagesd
SET amount = amount * 5,
LAST_UPDATED = `DATE`
WHERE `DATE` >= NOW() - INTERVAL 1 MINUTE
AND (`DATE` > LAST_UPDATED OR LAST_UPDATED IS NULL)
That way, every time your event runs you'll update all the rows that are due for update, but haven't yet been updated. This is not dependent on the precise time an event runs. The - INTERVAL 1 MINUTE allows the event to be up to a minute late running and still function correctly.
If you need to schedule another update for the future for a particular row, change the value of the DATE column but don't touch the LAST_UPDATED column.
Are you just looking for 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();
If you need the current real date time use 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();

mysql scheduled events problems

I have a table reservation containing starttime,endtime,status. i wanted to create an event scheduler which checks whether the current time is greater than endtime . if it is greater then it sets the status to 0.
but i want that scheduler to run everyday from 6 am to 6pm at 5 minutes interval for forever. so far i have written a code
CREATE EVENT rescancel
ON SCHEDULE EVERY 5 MINUTE
STARTS 06:00:00
ENDS 18:00:00
DO
UPDATE reservation SET status = 0 WHERE CURTIME() > endtime
how can i make sure that this event runs everyday? so far from what i have read from different websites , this code runs for every 5 minutes from 6 am to 6pm only for that day when event is created. am i wrong? i am new to mysql triggers and events.
I use something similar to check days and times, so you could use:
DELIMITER ||
CREATE EVENT rescancel
ON SCHEDULE
EVERY 5 MINUTE
STARTS NOW()
ON COMPLETION PRESERVE
COMMENT ''
DO
BEGIN
IF CURRENT_TIME BETWEEN '06:00:00' AND '18:00:00' THEN
UPDATE reservation SET status = 0 WHERE CURTIME() > endtime;
END IF;
END ||
DELIMITER ;
Test the current time in the query:
CREATE EVENT rescancel
ON SCHEDULE EVERY 5 MINUTE
DO
UPDATE reservation
SET status = 0
WHERE HOUR(CURTIME()) BETWEEN 6 AND 17
AND CURTIME() > endtime

MySQL CurDate() format to use MySQL EVENT for deleting (cleaning table) data after a day?

I have a MySQL table named registered where one of my rows named time is of type timestamp and I wanted to add an EVENT where all the entries in this table are deleted if they are older than one day. I have this so far...
CREATE EVENT delete_registration_data
ON SCHEDULE EVERY 1 DAY
DO
DELETE FROM `registered` where time < DATE_SUB(CurDate(), INTERVAL 1 DAY);
What I noticed however is that the timestamp datatype is made up of the CURDATE() and CURTIME() e.g. 2008-11-11 12:45:34. Would this cause a problem for the EVENT handler to delete from the table?
CREATE EVENT delete_registration_data
ON SCHEDULE EVERY 1 DAY
DO
DELETE FROM `registered` where date(time) < DATE_SUB(CurDate(), INTERVAL 1 DAY);