mysql写存储过程根据时间变化增加工龄
在工作中遇到要程序根据时间自动增加工龄的需求。
php没办法自己发起请求,又不想在服务器上写计划任务crontab,通过用户请求来更改又不能保证用户会去操作。
用数据库的存储过程和事件来完成。
数据库里有创建时间字段(created)和工龄(working_years)字段。
存储过程:
DROP PROCEDURE if EXISTS auto_working_years;
CREATE PROCEDURE auto_working_years()
BEGIN
DECLARE ns INT DEFAULT 1;
DECLARE myuid INT DEFAULT 0;
DECLARE cur1 CURSOR FOR
SELECT uid FROM `user` WHERE (role='ganger' OR role='worker') AND (DATEDIFF(CURRENT_DATE(),created)>365);
DECLARE EXIT HANDLER FOR NOT FOUND SET ns = 0;
OPEN cur1;
WHILE ns <> 0 DO
FETCH cur1 into myuid;
UPDATE `user` SET working_years = working_years+1 , created = DATE_ADD(created,INTERVAL 365 DAY) WHERE uid = myuid;
END WHILE;
CLOSE cur1;
END;
call auto_working_years();
首先定义游标,查询语句筛选出user表里角色是工人和工长的创建时间大于365天的记录。
开启游标
更新这些记录的表字段工龄+1,同时修改创建时间加一年,这里可以另创建一个字段用于对已经增加了工龄的记录做标记。把创建时间这一列复制过去。用新的字段来做判断就不会影响到创建时间。
这里用了两个mysql的系统时间函数 分别是DATEDIFF和DATE_ADD,一个获取时间差,一个增加时间间隔,间隔时间可以自己定义单位。
参数ns用于做是否执行循环的判断。
关闭游标
call用于调用存储过程。
还有个问题是存储过程执行过后记录已经更改但是显示的受影响行数是0
存储过程写完了接下来就是定时器了。我定义这个存储过程每周执行一次。
drop event if exists workingyearsEvent;
create event workingyearsEvent
on schedule every 7 day starts '2019-1-16 0:0:0'
on completion PRESERVE
do call auto_working_years();
剩下的就是需要打开mysql里面的一些设置
检查事件任务是否开启 SHOW VARIABLES LIKE 'event_scheduler';
set GLOBAL event_scheduler = 1;
ALTER EVENT workingyearsEvent ENABLE;
保证定时任务能正常执行了。
mysql写存储过程根据时间变化增加工龄的更多相关文章
- 实战:mysql写存储过程并定时调用
有表:cap_meter_detail 字段:recordtime 情景:recordtime每半个小时记录一次,故一天会产生很很多数据,我们要做的是,每天00:00:00对cap_meter_det ...
- mysql写存储过程并定时调用
设置一个定时任务:运行以下SQL -- 创建一个表test:字段endtime CREATE TABLE test (endtime DATETIME); -- 创建函数 :向test插入endt ...
- JAVA如何调用mysql写的存储过程
存储过程是干什么的,自己百度,百度上讲的比我讲的好.为什么要用存储过程,这样可以提高效率.废话少说,直接上代码: 首先说一下语法:在mysql中写存储过程 DELIMITER $$ CREATE /* ...
- 利用navicat写mysql的存储过程
最近项目经理让我给新的活动的预留一个插入红包和查看详情的sql,方便在项目出问题的做一些紧急操作,我想了下这里面还涉及到挺多逻辑和挺多表的一句句查也不方便啊,干脆写到存储过程里,于是开始在navica ...
- JDBC对MySQL数据库存储过程的调用
一.MySQL数据库存储过程: 1.什么是存储过程 存储过程(英文:Stored Procedure)是在大型数据库系统中,为了完成特定功能而编写的一组的SQL语句集.存储过程经编译存储在数据库中,用 ...
- Mysql的存储过程(以Mysql为例进行讲解)
我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储 在数据库中,用户通过指定存 ...
- MySQL笔记 存储过程 游标 触发器
第二十三章 使用存储过程 MySQL5 中添加了存储过程的支持. 大多数SQL语句都是针对一个或多个表的单条语句.并非所有的操作都怎么简单.经常会有一个完整的操作需要多条才能完成 存储过程简单来说,就 ...
- MySQL存储过程中的3种循环,存储过程的基本语法,ORACLE与MYSQL的存储过程/函数的使用区别,退出存储过程方法
在MySQL存储过程的语句中有三个标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环.还有一种非标准的循环方式:GOTO,不过这种循环方式最好别用,很容易引起程序的混乱,在这里就不错具体 ...
- mySQL的存储过程详解
mysql存储过程详解 1. 存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的S ...
随机推荐
- 将CHROME WEBSTORE里的APPS和扩展下载到本地 转载自:http://ro-oo.diandian.com/post/2011-05-28/1103036
Chrome Webstore 自动改版后就不能再直接下载到本地... 下载地址: https://clients2.google.com/service/update2/crx?response=r ...
- mysql基础篇--表的管理
表的创建 常见的数据类型 数值型: 整型 tinyint.smallint.mediumint.int/integer.bigint 特点: 1.如果不设置无符号还是有符号,默认是有符号,如果想设置无 ...
- hudson 使用节点打包出现ClassNotFoundException: org.jvnet.hudson.maven3.agent.Maven3Main 错误
java.lang.NoClassDefFoundError: org/jvnet/hudson/maven3/agent/Maven3Main Caused by: java.lang.ClassN ...
- 最后执行finally
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- tomcat——Server.xml
本机tomcat位置:D:\tomcat7\apache-tomcat-7.0.61 server.xml 位置:D:\tomcat7\apache-tomcat-7.0.61\conf 注意:ser ...
- 003_FREERTOS任务基础知识
(一)任务状态 FreeRTOS 中的任务永远处于下面几个状态中的某一个: ● 运行态当一个任务正在运行时,那么就说这个任务处于运行态,处于运行态的任务就是当前正在使用处理器的任务.如果使用的是单核处 ...
- Oracle 三种连接方式 NESTED LOOP HASH JOIN SORT MERGE JOIN
NESTED LOOP: 对于被连接的数据子集较小的情况,嵌套循环连接是个较好的选择.在嵌套循环中,内表被外表驱动,外表返回的每一行都要在内表中检索找到与它匹配的行,因此整个查询返回的结果集不能太大( ...
- 安装包设计-------打包(MFC)---------知识总结
目录: 1.选择文件夹 2.判断文件夹或文件是否存在 3.通过cmd命令行向程序中传递参数. 4.路径处理 5.文件夹以及文件的删除 6.复制文件 7.创建目录 8.从当前的应用程序中抽取资源 9.引 ...
- shell 获取指定ip的丢包率
shell 获取指定ip的丢包率 丢包率大于10%就重新网络 使用sed 替换字符串 [[ $(ping -c 10 -W 1 baidu.com | awk '$6 ~ /%/{print $6}' ...
- js 选择文本
怎么用js脚本,选中文本呢? // 获取selection对象 var selection = window.getSelection(); // 清空selection对象 selection.re ...