有表:cap_meter_detail

字段:recordtime

情景:recordtime每半个小时记录一次,故一天会产生很很多数据,我们要做的是,每天00:00:00对cap_meter_detail 按时间拆分,比如,今天是2018年09月10号,那就将所有recordtime的日期为2018-09-10的拆分到表cap_meter_detail _20180610

思路:1、建表 cap_meter_detail _20180610

2、从cap_meter_detail 找出date(recordtime)="2018-09-10"的所有数据,插入到cap_meter_detail _20180610

3、将插入的数据从cap_meter_detail 里面删除

由于可能某个时间段数据库出问题,没有及时删除,所以,我们需要做个循环,用存储过程的思路解决,如下图,找出来有11天的,那就要循环11次

步骤:

1、写存储过程myFun_cap_meter_detail

BEGIN  

-- 定义变量
DECLARE tableName_bl VARCHAR(50);
-- 定义done
DECLARE done INT; -- 定义表名(tableName)游标
DECLARE rs_tableName CURSOR FOR -- 得到游标集合
SELECT
-- recordtime,
-- GROUP_CONCAT(id) ammeterid_group,
-- DATE_FORMAT(recordtime, '%Y%m%d'),
CONCAT('cap_meter_detail_',DATE_FORMAT(recordtime, '%Y%m%d')) tableName
FROM
`cap_meter_detail`
WHERE
recordtime < DATE(NOW())
GROUP BY
DATE_FORMAT(recordtime, '%Y%m%d'); DECLARE CONTINUE HANDLER FOR SQLSTATE '' SET done=1; -- 初始化done,为0,false
set done = 0; open rs_tableName;
REPEAT FETCH rs_tableName into tableName_bl; -- 将类似 2018-03-19 00:22:00的数据插入到 cap_meter_20180319
if done<>1 then SET @var= tableName_bl; -- 建表 SET @createTableSqlStr=CONCAT("CREATE TABLE ",tableName_bl,"
(
id int(11) NOT NULL AUTO_INCREMENT,
ammeterid int(11) DEFAULT NULL,
a_voltage double(11,2) DEFAULT NULL,
b_voltage double(11,2) DEFAULT NULL,
c_voltage double(11,2) DEFAULT NULL,
frequence double(11,2) DEFAULT NULL,
a_current double(11,2) DEFAULT NULL,
b_current double(11,2) DEFAULT NULL,
c_current double(11,2) DEFAULT NULL,
total_power_factor double(11,2) DEFAULT NULL,
a_power_factor double(11,2) DEFAULT NULL,
b_power_factor double(11,2) DEFAULT NULL,
c_power_factor double(11,2) DEFAULT NULL,
total_active_power double(11,2) DEFAULT NULL,
a_active_power double(11,2) DEFAULT NULL,
b_active_power double(11,2) DEFAULT NULL,
c_active_power double(11,2) DEFAULT NULL,
total_reactive_power double(11,2) DEFAULT NULL,
a_reactive_power double(11,2) DEFAULT NULL,
b_reactive_power double(11,2) DEFAULT NULL,
c_reactive_power double(11,2) DEFAULT NULL,
recordtime datetime DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=51927530 DEFAULT CHARSET=utf8"); -- 查看函数
SELECT @createTableSqlStr; -- 执行函数
PREPARE createTableSqlStr FROM @createTableSqlStr;
EXECUTE createTableSqlStr; -- 插入 SET @insertSqlStr=CONCAT("INSERT INTO ",tableName_bl,
" SELECT * FROM cap_meter_detail WHERE recordtime < DATE(NOW()) AND DATE_FORMAT(recordtime, '%Y%m%d')=right('",@var,"',8)"); -- 查看函数
SELECT @insertSqlStr; -- 执行函数
PREPARE insertSqlStr FROM @insertSqlStr;
EXECUTE insertSqlStr; -- 删除 SET @deleteSqlStr=CONCAT("DELETE FROM cap_meter_detail WHERE recordtime < DATE(NOW()) AND DATE_FORMAT(recordtime, '%Y%m%d')=right('",@var,"',8)"); -- 查看函数
SELECT @deleteSqlStr;
-- 执行函数
PREPARE deleteSqlStr FROM @deleteSqlStr;
EXECUTE deleteSqlStr; end if; -- 直到done变为true结束循环
UNTIL done END
REPEAT;
close rs_tableName;
END

2、写事件:myEvent_cap_meter_detail

CREATE EVENT
IF NOT EXISTS myEvent_cap_meter_detail ON SCHEDULE EVERY 24 HOUR ON COMPLETION PRESERVE DO
CALL myFun_cap_meter_detail();

3、启用事件

-- 查看事件状态
SHOW VARIABLES LIKE '%event_scheduler%'; -- 启用事件
SET GLOBAL event_scheduler =1

  

实战:mysql写存储过程并定时调用的更多相关文章

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

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

  2. mysql写存储过程根据时间变化增加工龄

    在工作中遇到要程序根据时间自动增加工龄的需求. php没办法自己发起请求,又不想在服务器上写计划任务crontab,通过用户请求来更改又不能保证用户会去操作. 用数据库的存储过程和事件来完成. 数据库 ...

  3. MySQL数据库----存储过程

    存储过程 存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql -- 存储过程的优点: -- 1.程序与数据实现解耦 -- 2.减少网络传输的 ...

  4. MySql创建存储过程,并使用事件定时调用

    一.使用命令行创建存储过程的步骤 :参数详情参考 https://www.mysqlzh.com/ 1.模板  delimiter $$ # 设置分隔符为 '$$' ,mysql默认的语句分隔符为 ' ...

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

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

  6. MySQL存储过程_创建-调用

    阅读目录:MySQL存储过程_创建-调用-参数 存储过程:SQL中的"脚本" 创建存储过程 调用存储过程 存储过程体 语句块标签 存储过程的参数 in:向过程里传参 out:过程向 ...

  7. shell脚本 如何调用Mysql的存储过程 解决方案

    今天遇到一个在shell脚本里面要调用MySQL的存储过程,查阅了很多资料,发现有的都不好用,自己调试出了如下一种,拿来共享: 用mysql -e “ ”: 例如:   mysql -uroot -p ...

  8. MySQL 开启事件 使用定时器调用存储过程

      mysql定时器是系统给提供了event,而oracle里面的定时器是系统给提供的job.废话少说,下面创建表:create table mytable (id int auto_incremen ...

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

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

随机推荐

  1. linux系统配置之bash shell的配置(centos)

    linux系统开机启动过程的最后阶段会由init进程根据启动方案(运行级:0-6)启动许多基本的服务程序,为用户提供各种各样的服务.在启动这些服务的最后会启动一个为用户提供操作环境的服务,用户就是通过 ...

  2. python pickle/cPickle模块

    序列化(picking): 把变量从内存中变成可存储或传输的过程称为序列化,序列化之后,就可以把序列化的对象写入磁盘,或者传输给其他设备; 反序列化(unpickling):相应的,把变量的内容从序列 ...

  3. excel 基本用法

  4. oracle下 启动subversion命令 及 oracle相关服务启动备忘

    linux shell下  svnserve - d -r + 目录   例如:svnserve -d -r /svn 启动 svn服务. 访问svn://192.168.0.120/kjcg 测试. ...

  5. C语言之fileno()函数--获取已经打开的文件的文件描述符(小技巧)

    open函数相关的:  /* open 是系统调用 返回的是文件句柄*/ #include <sys/stat.h> #include <fcntl.h> int open(c ...

  6. Thrift之代码生成器Compiler原理及源码详细解析2

    我的新浪微博:http://weibo.com/freshairbrucewoo. 欢迎大家相互交流,共同提高技术. 2  t_generator类和t_generator_registry类 这个两 ...

  7. HDU2190

    悼念512汶川大地震遇难同胞——重建希望小学 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  8. CSS:CSS 合法颜色值

    ylbtech-CSS:CSS 合法颜色值 1.返回顶部 1. CSS 颜色 可以用以下方法来规定 CSS 中的颜色: 十六进制色 RGB 颜色 RGBA 颜色 HSL 颜色 HSLA 颜色 预定义/ ...

  9. web应用目录结构

    news web(应用的名字)||--静态资源和JSP文件都可以直接放在web应用的目录下,浏览器可以直接访问(html/jsp/css)|--WEB-INF 可以没有,但是最好有,一旦有,则结构需要 ...

  10. python在三引号中使用变量