在工作中遇到要程序根据时间自动增加工龄的需求。

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写存储过程根据时间变化增加工龄的更多相关文章

  1. 实战:mysql写存储过程并定时调用

    有表:cap_meter_detail 字段:recordtime 情景:recordtime每半个小时记录一次,故一天会产生很很多数据,我们要做的是,每天00:00:00对cap_meter_det ...

  2. mysql写存储过程并定时调用

    设置一个定时任务:运行以下SQL -- 创建一个表test:字段endtime CREATE TABLE test (endtime DATETIME);   -- 创建函数 :向test插入endt ...

  3. JAVA如何调用mysql写的存储过程

    存储过程是干什么的,自己百度,百度上讲的比我讲的好.为什么要用存储过程,这样可以提高效率.废话少说,直接上代码: 首先说一下语法:在mysql中写存储过程 DELIMITER $$ CREATE /* ...

  4. 利用navicat写mysql的存储过程

    最近项目经理让我给新的活动的预留一个插入红包和查看详情的sql,方便在项目出问题的做一些紧急操作,我想了下这里面还涉及到挺多逻辑和挺多表的一句句查也不方便啊,干脆写到存储过程里,于是开始在navica ...

  5. JDBC对MySQL数据库存储过程的调用

    一.MySQL数据库存储过程: 1.什么是存储过程 存储过程(英文:Stored Procedure)是在大型数据库系统中,为了完成特定功能而编写的一组的SQL语句集.存储过程经编译存储在数据库中,用 ...

  6. Mysql的存储过程(以Mysql为例进行讲解)

       我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储 在数据库中,用户通过指定存 ...

  7. MySQL笔记 存储过程 游标 触发器

    第二十三章 使用存储过程 MySQL5 中添加了存储过程的支持. 大多数SQL语句都是针对一个或多个表的单条语句.并非所有的操作都怎么简单.经常会有一个完整的操作需要多条才能完成 存储过程简单来说,就 ...

  8. MySQL存储过程中的3种循环,存储过程的基本语法,ORACLE与MYSQL的存储过程/函数的使用区别,退出存储过程方法

    在MySQL存储过程的语句中有三个标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环.还有一种非标准的循环方式:GOTO,不过这种循环方式最好别用,很容易引起程序的混乱,在这里就不错具体 ...

  9. mySQL的存储过程详解

    mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的S ...

随机推荐

  1. python_tkinter事件

    1.事件绑定函数(3个) 组件.bind('事件类型',事件函数) 为一个组件绑定一个操作 组件.bind_class('组件类型','事件类型',事件函数) 为一个类组件绑定一个操作 组件.bind ...

  2. MongoDB常用语句大全

    原文出处:https://www.cnblogs.com/--smile/p/11055204.html 直接输入mongo进入数据库 查询操作 查看当前数据库版本 db.version() //4. ...

  3. proc文件系统详解

    /proc 文件系统是一个虚拟文件系统,通过它可以使用一种新的方法在 Linux内核空间和用户间之间进行通信.在 /proc 文件系统中,我们可以将对虚拟文件的读写作为与内核中实体进行通信的一种手段, ...

  4. JQuery实践--实用工具函数

    实用工具函数,$命名空间的一系列函数,但不操作包装集.它要么操作除DOM元素以外的Javascript对象,要么执行一些非对象相关的操作. JQuery的浏览器检测标志可在任何就绪处理程序执行之前使用 ...

  5. crm-权限管理

    1 用户登录 设置session 将权限存放在session中 2 设置中间件,进行拦截 0 添加白名单,判断是否在白名单上 1 判断是否登录 2 权限过滤

  6. vs2015 调试 无法启动程序

    应用程序输出在这个目录 E:\learn\3dlesson\lesson1_createwindow\build\Debug 项目属性 解决方案: 把项目设为启动项目.

  7. 2019.6.28 校内测试 T2 【音乐会】二重变革

    看到这个题之后,一个很暴力很直接的想法就是贴上题目中的代码然后交上去走人,但是很显然这是会TLE+MLE的,想想谁会这么傻把主要代码给你QwQ~: 其实这段代码是想告诉你一件事:用序列中的大数减去小数 ...

  8. skb head/data/tail/end/介绍

    2017年04月26日 18:21:12 abcLinux 阅读数 799   This first diagram illustrates the layoutof the SKB data are ...

  9. scrapy框架之Selectors选择器

    Selectors(选择器) 当您抓取网页时,您需要执行的最常见任务是从HTML源中提取数据.有几个库可以实现这一点: BeautifulSoup是Python程序员中非常流行的网络抓取库,它基于HT ...

  10. Ubuntu14.04 挂载u盘

    插入u盘后, $cat /proc/partitions 发现多了 sdb sdb4 sdb是统称,所以新插入的U盘就是/dev/sdb4 $ls /dev |grep sdb sdb sdb4 查看 ...