MySQL定时任务,和处理订单状态,定时取消

SHOW VARIABLES LIKE '%event_sche%';		//查看event是否开启
SET GLOBAL event_scheduler = 1;		//将事件计划开启
SET GLOBAL event_scheduler = 0;		//将事件计划关闭 
ALTER EVENT eventName ON COMPLETION PRESERVE DISABLE;	//关闭事件任务
ALTER EVENT eventName ON COMPLETION PRESERVE ENABLE;	//开启事件任务
SHOW EVENTS ;	//查看事件任务

创建一个定时任务写法:

create event second_event_name
on schedule every 30 minute
on completion preserve disable
do sql语句

实例:
表名:test_timer ;字段id自增长,name

SHOW VARIABLES LIKE '%event_sche%';
SET GLOBAL event_scheduler = 1;
create event t_test_timer_venet
on schedule every 1 second
on completion preserve disable
do insert into test_timer (name) values("测试时间1秒钟插入一次")
	
SHOW EVENTS ;
//查看status是否开启如果没有:
ALTER EVENT eventName ON COMPLETION PRESERVE ENABLE;
//查看表数据:已经有了。
//关闭:
ALTER EVENT eventName ON COMPLETION PRESERVE DISABLE;

常见周期定时规则
周期执行-关键字 EVERY
单位有 second(秒),minute(分钟),hour(小时),day(天),week(周),quarter(季度),month(月),year(年)

//举例:
on schedule every 1 second	//每秒执行一次
on schedule every 2 minute      //每两分钟执行一次
//列外:
on schedule at '2020-8-19 16:50:00'	//在2020-8-19 16:50:00时执行
on schedule at current_timestamp()+interval 10 minute //10分钟后执行
on schedule at current_timestamp()+interval 5 day //5天后执行
//其中current_timestamp()是当前时间戳函数

//在某个时间段执行–关键字STARTS ENDS
on schedule every 1 day starts current_timestamp()+interval 5 day ends current_timestamp()+interval 1 month //5天后开始每天都执行执行到下个月底
on schedule every 1 day ends current_timestamp()+interval 5 day //从现在起每天执行,执行5天

例子,编写订单未支付超过60分钟就取消

create event study_order_timer_event
on schedule every 1 minute
on completion preserve disable
do update study_order set order_status_id=0 where round(TIME_TO_SEC(TIMEDIFF(NOW(),FROM_UNIXTIME(date_added))) /60) >60 and order_status_id = 1;

然后开启事件任务
其中:
round(TIME_TO_SEC(TIMEDIFF(NOW(),FROM_UNIXTIME(date_added))) /60) 这个方法返回现在时间和订单时间的差值
round(num):四舍五入
TIME_TO_SEC(time):函数将时间值转换为秒
TIMEDIFF(day1,day2):函数返回两个日期之间的天数,day1格式:YYYY-MM-DD H:i:s
now():现在的时间
FROM_UNIXTIME(date_added):因为数据库,存订单时间是unix时间戳的需要FROM_UNIXTIME()转成YYYY-MM-DD H:i:s

//查询
SELECT * from study_order where round(TIME_TO_SEC(TIMEDIFF(NOW(),FROM_UNIXTIME(date_added))) /60) >60 and order_status_id = 1;

猜你喜欢

转载自blog.csdn.net/hgb24660/article/details/108105280