赞
踩
由于霍尼韦尔门禁项目要求,需要把设备信息存到数据库当中,并需要实现数据三天有效期,过期数据会定时检查删除掉。本文章主要讲关于实现数据三天有效期的业务实现。
DELIMITER //
create procedure del_data()
BEGIN
delete from t_device_info where f_time < date_sub(curdate(), interval 3 day);
END//
DELIMITER ;
注意:
delimiter // 是定义结束符。mysql 默认的结束符是;号,这里重新定义了结束符为//,否则中间的语句中遇到 ;号,会认为语句已经结束了。所以需要重新定义结束符,否则会报错。END 后面加//,就是代表已经结束。感觉好坑
mysql> show procedure status;
+------+----------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db | Name | Type | Definer | Modified | Created | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+------+----------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| test | del_data | PROCEDURE | root@localhost | 2019-10-18 17:47:09 | 2019-10-18 17:47:09 | DEFINER | | utf8 | utf8_general_ci | utf8_general_ci |
+------+----------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
1 row in set
select `name` from mysql.proc where db = 'xx' and `type` = 'PROCEDURE' //存储过程
select `name` from mysql.proc where db = 'xx' and `type` = 'FUNCTION' //函数
show procedure status; //存储过程
show function status; //函数
show create procedure proc_name;
show create function func_name;
SELECT * from information_schema.VIEWS //视图
SELECT * from information_schema.TABLES //表
SHOW TRIGGERS [FROM db_name] [LIKE expr]
SELECT * FROM triggers T WHERE trigger_name=”mytrigger” \G
create event del_event
on schedule
EVERY 10 second
STARTS '2019-10-06 16:37:00'
ON COMPLETION PRESERVE ENABLE
do call del_data();
Mysql数据库显示
首先查看mysql是否开启定时任务开关
SHOW VARIABLES LIKE ‘event_scheduler’;
Value为ON则已打开,OFF则关闭
如果是OFF,就先打开
方法一:执行mysql语句
set global event_scheduler = on;
方法二:永久开启方法:
my.cnf中[mysqld]添加event_scheduler=on #重启服务
这个是最简单但是也是最重要的,我们要手动的启动这个定时器,要不然是没法工作的。
ALTER EVENT del_event ON COMPLETION PRESERVE ENABLE;
如果不想用该定时器了的话,可以直接在数据库事件中将状态更改为ENable即可。
使用navicat连接的数据库->事件->找到对应的事件修改
如果想要调整定时器执行时间间隔,可以直接在事件中修改
mysql> select * from t_device_info where to_days(now())-to_days(f_time) >= 3;
+------+---------------------+-----------------+-------------+----------+------------+
| f_id | f_time | f_ADVDeviceName | f_ADVStatus | f_status | f_describe |
+------+---------------------+-----------------+-------------+----------+------------+
| 8 | 2019-10-14 14:04:38 | MJ-F46-A02 | 903 | | 面板正常 |
| 3187 | 2019-10-13 17:37:00 | | | 有效卡 | |
| 3563 | 2019-10-14 06:39:00 | | | 有效卡 | |
| 3950 | 2019-10-10 11:55:00 | | | 有效卡 | |
| 4350 | 2019-10-11 10:12:00 | | | 有效卡 | |
| 4361 | 2019-10-14 16:37:00 | | | 有效卡 | |
+------+---------------------+-----------------+-------------+----------+------------+
6 rows in set
TO_DAYS函数
TO_DAYS函数 返回一个天数! 啊哈?什么天数? 从年份0开始的天数
mysql> SELECT TO_DAYS('2019-10-08 17:33:43');
+--------------------------------+
| TO_DAYS('1997-10-07 17:33:43') |
+--------------------------------+
| 729669 |
+--------------------------------+
就是从0年开始 到2019年10月8号之间的天数。
mysql to_days函数的使用
//1,查询当天(今天)的数据 SELECT * FROM `order` WHERE TO_DAYS(order_time) = TO_DAYS(NOW()) //2,查询昨天的数据 SELECT * FROM `order` WHERE TO_DAYS(NOW()) - TO_DAYS(order_time) = 1 //3,查询最近7天的数据(包括今天一共7天) SELECT * FROM `order` where DATE_SUB(CURDATE(), INTERVAL 7 DAY) < date(order_time) //4,查询最近30天的数据(包括今天一共30天) SELECT * FROM `order` where DATE_SUB(CURDATE(), INTERVAL 30 DAY) < date(order_time) //5,查询当月(本月)的数据 SELECT * FROM `order` WHERE DATE_FORMAT(order_time, '%Y%m') = DATE_FORMAT(CURDATE(), '%Y%m') //6,查询上个月的数据 SELECT * FROM `order` WHERE PERIOD_DIFF(DATE_FORMAT(NOW(),'%Y%m'), DATE_FORMAT(order_time,'%Y%m')) =1 //7,查询本季度的数据 SELECT * FROM `order` WHERE QUARTER(order_time)=QUARTER(NOW()) //8,查询上季度的数据 SELECT * FROM `order` WHERE QUARTER(order_time)=QUARTER(DATE_SUB(NOW(),INTERVAL 1 QUARTER)) //9,查询当年(今年)的数据 SELECT * FROM `order` WHERE YEAR(order_time)=YEAR(NOW()) //10,查询去年的数据 SELECT * FROM `order` WHERE YEAR(order_time)=YEAR(DATE_SUB(NOW(),INTERVAL 1 YEAR))
mysql> select * from t_device_info where f_time < date_sub(curdate(), interval 3 day);
+------+---------------------+-----------------+-------------+----------+------------+
| f_id | f_time | f_ADVDeviceName | f_ADVStatus | f_status | f_describe |
+------+---------------------+-----------------+-------------+----------+------------+
| 16 | 2019-10-08 14:04:38 | MJ-F45-A02 | 903 | | 面板正常 |
+------+---------------------+-----------------+-------------+----------+------------+
1 row in set
定义和用法
DATE_SUB() 函数从日期减去指定的时间间隔。
语法
DATE_SUB(date,INTERVAL expr type)
date 参数是合法的日期表达式。expr 参数是您希望添加的时间间隔。
type 参数可以是下列值:
Type 值 |
---|
MICROSECOND |
SECOND |
MINUTE |
HOUR |
DAY |
WEEK |
MONTH |
QUARTER |
YEAR |
SECOND_MICROSECOND |
MINUTE_MICROSECOND |
MINUTE_SECOND |
HOUR_MICROSECOND |
HOUR_SECOND |
HOUR_MINUTE |
DAY_MICROSECOND |
DAY_SECOND |
DAY_MINUTE |
DAY_HOUR |
YEAR_MONTH |
mysql> select * from t_device_info where to_days(now())-to_days(f_time) >= 3;
Empty set
call del_data()

BEGIN
delete from t_device_info where f_time < data_sub(curdata ,interval 3 day);
END
CREATE DEFINER=`root`@`localhost` PROCEDURE `del_data`()
BEGIN
delete from t_device_info where now() > date_add(f_time,interval 3 day);
END
-- now() 返回当前日期和时间,格式如下:2013-01-17 10:57:13 mysql> select now(), sleep(5), now(); +---------------------+----------+---------------------+ | now() | sleep(5) | now() | +---------------------+----------+---------------------+ | 2013-01-17 10:57:13 | 0 | 2013-01-17 10:57:13 | +---------------------+----------+---------------------+ 两个值相同,表示语句开始执行的时间。 -- curdate() 返回当前日期,格式如下:2013-01-17 mysql> select curdate(); +------------+ | curdate() | +------------+ | 2013-01-17 | +------------+ -- curtime(), 返回当前时间,格式如下:12:49:26 mysql> select curtime(), sleep(5), curtime(); +-----------+----------+-----------+ | curtime() | sleep(5) | curtime() | +-----------+----------+-----------+ | 12:49:26 | 0 | 12:49:26 | +-----------+----------+-----------+ 两个值相同,都表示语句开始执行的时间。 -- sysdate() 返回当前日期和时间,格式:2013-01-17 13:02:40 mysql> select sysdate(), sleep(5), sysdate(); +---------------------+----------+---------------------+ | sysdate() | sleep(5) | sysdate() | +---------------------+----------+---------------------+ | 2013-01-17 13:02:40 | 0 | 2013-01-17 13:02:45 | +---------------------+----------+---------------------+ 两个值不同,sysdate表示实时的系统时间。 sysdate() 和 now()的区别,一般在执行SQL语句时,都是用now(); 因为使用sysdate()时,有可能导致主库和从库执行时返回值不一样,导致主从数据库不一致。 其它函数格式显示: mysql> select now(), curdate(), sysdate(), curtime() \G; *************************** 1. row *********************** now(): 2013-01-17 13:07:53 curdate(): 2013-01-17 sysdate(): 2013-01-17 13:07:53 curtime(): 13:07:53
以下代码中times为时间字段,类型为datetime
//大于号后面都是获取times十五分钟后的时间
select*from table where now() >SUBDATE(times,interval -15 minute);
select*from table where now() > SUBDATE(times,interval -900 second);
select*from table where now() > date_add(times,interval 15 minute);
select*from table where now() >ADDDATE(times,interval 15 minute);
//大于号后面都是获取times一小时后的时间
select*from table where now() >SUBDATE(times,interval -1 hour);
select*from table where now() > SUBDATE(times,interval -60*60 second);
select*from table where now() > date_add(times,interval -1 hour);
select*from table where now() >ADDDATE(times,interval 15 hour);
//大于号后面都是获取times一天后的时间
select*from table where now() >SUBDATE(times,interval -1 day);
select*from table where now() > SUBDATE(times,interval -60*60*60 second);
select*from table where now() > date_add(times,interval -1 day);
select*from table where now() >ADDDATE(times,interval 15 day);
相应的如果想查询前一天的数据,加一个“-”号即可
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。