MySQL定时任务存储过程函数和动态表名实例

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: MySQL定时任务存储过程函数和动态表名实例
#存储过程 每月AP和 FPV和 平均量
DROP PROCEDURE IF EXISTS pro_save_ap_manage_result_;
CREATE PROCEDURE pro_save_ap_manage_result_ () #名称:pro_save_ap_manage_result_
   BEGIN #开始
   -- --------------内容开始--------------------------
   insert into wbo_ap_manage_result
      SELECT DISTINCT
        count(DISTINCT a.AP_CODE) AP_CODE,
        -- a.SSID,
        sum(a.pv) pv,
        sum(a.uv) uv,
        sum(a.cpc) cpc,
        sum(a.cpm) cpm,
        sum(a.flow) flow,
        sum(a.P_FLOW) P_FLOW,
        sum(a.DURATION) DURATION,
        sum(a.RPV) RPV,
        sum(a.FPV) FPV,
        a.`MONTH`,
        a.`YEAR`,
        ROUND(sum(a.FPV) / count(DISTINCT a.AP_CODE)) pvAverage
      FROM
        wbo_ap_dtl_day a
      WHERE
        a. YEAR = year(curdate()) #本年
      AND a. MONTH = date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y%m') #上月
      AND a. DAY >= date_format(date_sub(date_sub(date_format(now(),'%y%m%d'),interval extract( day from now())-1 day),interval 1 month),'%Y%m%d') #上月第一天
      AND a. DAY <= date_format(date_sub(date_sub(date_format(now(),'%y%m%d'),interval extract( day from now()) day),interval 0 month),'%Y%m%d') #上月最后一天
      GROUP BY
        a.`YEAR`,
        a.`MONTH`; #以';'结束
      #多条语句
      select now();#以';'结束
      -- --------------注意“;”内容结束--------------------------
   END;#结束
#事件 定时执行
DROP EVENT IF EXISTS eve_run_ap_manage_result_;
CREATE EVENT `eve_run_ap_manage_result_`
ON SCHEDULE EVERY 1 month STARTS '2016-10-01 00:00:00'#每月1号执行
ON COMPLETION NOT PRESERVE ENABLE
DO CALL `pro_save_ap_manage_result_`
/*
 DROP EVENT IF EXISTS eve_run_ap_manage_result_;
 CREATE EVENT `eve_run_ap_manage_result_`
 ON SCHEDULE EVERY 5 SECOND STARTS '2016-09-22 00:00:00'#每5s执行
 ON COMPLETION NOT PRESERVE ENABLE
 DO CALL `pro_save_ap_manage_result_`
*/
#存储过程 日均维度表月表分表
DROP PROCEDURE IF EXISTS pro_ap_month_dtl_day_;
CREATE PROCEDURE pro_ap_month_dtl_day_(in pvAverage VARCHAR (32),in tab_name VARCHAR (32))
BEGIN
set @STMT:=concat("INSERT INTO ",getApMonthTabName(tab_name), #动态表名
" SELECT DISTINCT
      a.AP_CODE AP_CODE,
      -- a.SSID,
      SUM(a.pv) pv,
      SUM(a.uv) uv,
      SUM(a.cpc) cpc,
      SUM(a.cpm) cpm,
      SUM(a.flow) flow,
      SUM(a.P_FLOW) P_FLOW,
      SUM(a.DURATION) DURATION,
      SUM(a.RPV) RPV,
      SUM(a.FPV) FPV,
      a.`MONTH`,
      a.`YEAR`,
      CASE
      WHEN ROUND( SUM(a.fpv) / COUNT(DISTINCT a.AP_CODE) ) > 0 and ROUND( SUM(a.fpv) / COUNT(DISTINCT a.AP_CODE) ) < ",pvAverage," THEN 2
      WHEN ROUND( SUM(a.fpv) / COUNT(DISTINCT a.AP_CODE) ) >=",pvAverage," THEN 1
      ELSE 3
      END apState
   FROM
      wbo_ap_dtl_day a
   WHERE
      a. YEAR = year(curdate())#本年
        AND a. MONTH = date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y%m') #上月
        AND a. DAY >= date_format(date_sub(date_sub(date_format(now(),'%y%m%d'),interval extract( day from now())-1 day),interval 1 month),'%Y%m%d') #上月第一天
        AND a. DAY <= date_format(date_sub(date_sub(date_format(now(),'%y%m%d'),interval extract( day from now()) day),interval 0 month),'%Y%m%d') #上月最后一天
   GROUP BY
      a.AP_CODE,
      a.`YEAR`,
      a.`MONTH`");
   PREPARE stmt FROM @STMT;
   EXECUTE stmt ;
end;
  • 调用存储过程
call pro_ap_month_dtl_day_('4','8');
call pro_ap_month_dtl_day_(getpvAverage(),date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%c'));
#存储过程 日均维度月临时表
DROP PROCEDURE IF EXISTS pro_wbo_ap_dtl_month_tmp_;
CREATE PROCEDURE pro_wbo_ap_dtl_month_tmp_(in pvAverage VARCHAR (32))
BEGIN
INSERT INTO wbo_ap_dtl_month_tmp
   SELECT DISTINCT
      a.AP_CODE AP_CODE,
      -- a.SSID,
      SUM(a.pv) pv,
      SUM(a.uv) uv,
      SUM(a.cpc) cpc,
      SUM(a.cpm) cpm,
      SUM(a.flow) flow,
      SUM(a.P_FLOW) P_FLOW,
      SUM(a.DURATION) DURATION,
      SUM(a.RPV) RPV,
      SUM(a.FPV) FPV,
      a.`day`,
      a.`MONTH`,
      a.`YEAR`,
      CASE
      WHEN ROUND( SUM(a.fpv) / COUNT(DISTINCT a.AP_CODE) ) > 0 and ROUND( SUM(a.fpv) / COUNT(DISTINCT a.AP_CODE) ) < pvAverage THEN 2
      WHEN ROUND( SUM(a.fpv) / COUNT(DISTINCT a.AP_CODE) ) >= pvAverage THEN 1
      ELSE 3
      END apState
   FROM
      wbo_ap_dtl_day a
   WHERE
      a. YEAR = year(curdate())#本年
        AND a. MONTH = date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y%m') #上月
        AND a. DAY >= date_format(date_sub(date_sub(date_format(now(),'%y%m%d'),interval extract( day from now())-1 day),interval 1 month),'%Y%m%d') #上月第一天
        AND a. DAY <= date_format(date_sub(date_sub(date_format(now(),'%y%m%d'),interval extract( day from now()) day),interval 0 month),'%Y%m%d') #上月最后一天
   GROUP BY
      a.AP_CODE,
      a.`YEAR`,
      a.`MONTH`;
end;
  • 调用
call pro_wbo_ap_dtl_month_tmp_('4');
call pro_wbo_ap_dtl_month_tmp_(getpvAverage());
#事件 定时执行
 DROP EVENT IF EXISTS eve_ap_month_dtl_day_;
   CREATE EVENT `eve_ap_month_dtl_day_`
   ON SCHEDULE EVERY 1 month STARTS '2016-10-01 00:30:00'#每月1号执行
   ON COMPLETION NOT PRESERVE ENABLE
   DO CALL `pro_ap_month_dtl_day_(getpvAverage(),fn_last_month())`
#函数 根据月份获得ap月分表名称
  DROP FUNCTION IF EXISTS getApMonthTabName;
  CREATE FUNCTION `getApMonthTabName`(_month varchar(32))
     RETURNS varchar(32)
     READS SQL DATA
  BEGIN
     DECLARE cnt varchar(32) DEFAULT '';
     IF _month = '1'
     THEN
      SET cnt = 'wbo_ap_dtl_day_m1';
     ELSEIF _month = '2'
     THEN
      SET cnt = 'wbo_ap_dtl_day_m2';
      ELSEIF _month = '3'
          THEN
          SET cnt = 'wbo_ap_dtl_day_m3';
     ELSEIF _month = '4'
          THEN
          SET cnt = 'wbo_ap_dtl_day_m4';
     ELSEIF _month = '5'
          THEN
          SET cnt = 'wbo_ap_dtl_day_m5';
     ELSEIF _month = '6'
          THEN
          SET cnt = 'wbo_ap_dtl_day_m6';
     ELSEIF _month = '7'
          THEN
          SET cnt = 'wbo_ap_dtl_day_m7';
     ELSEIF _month = '8'
          THEN
          SET cnt = 'wbo_ap_dtl_day_m8';
     ELSEIF _month = '9'
          THEN
          SET cnt = 'wbo_ap_dtl_day_m9';
     ELSEIF _month = '10'
          THEN
           SET cnt = 'wbo_ap_dtl_day_m10';
     ELSEIF _month = '11'
          THEN
          SET cnt = 'wbo_ap_dtl_day_m11';
     ELSEIF _month = '12'
          THEN
          SET cnt = 'wbo_ap_dtl_day_m12';
     END IF ;
     RETURN cnt ;
  END;
#函数 获得平均数
   DROP FUNCTION IF EXISTS getpvAverage;
   CREATE FUNCTION `getpvAverage`()
      RETURNS int
      READS SQL DATA
   BEGIN
      DECLARE cnt int DEFAULT 0;
      select a.pvAverage into cnt from wbo_ap_manage_result a where
        a.YEAR = year(curdate()) #本年
        AND a. MONTH = date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y%m'); #上月
      RETURN cnt ;
   END;
#函数 获得上月  
DROP FUNCTION IF EXISTS fn_last_month;
   CREATE FUNCTION `fn_last_month`()
      RETURNS int
      READS SQL DATA
   BEGIN
      DECLARE cnt int DEFAULT 0;
      select date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%c') into cnt;#上月2016-09-11
      RETURN cnt ;
   END;
#函数 获得上月
  DROP FUNCTION IF EXISTS fn_last_month1;
   CREATE FUNCTION `fn_last_month1`()
      RETURNS int
      -- READS SQL DATA
   BEGIN
      DECLARE cnt int DEFAULT 0;
      select date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y%m')#上月201609
                into cnt ;
      RETURN cnt ;
   END;
#获得上月 201609
select fn_last_month1();
#函数 上月天数
DROP FUNCTION IF EXISTS fn_last_month_num;
CREATE FUNCTION `fn_last_month_num`()
   RETURNS int
   -- READS SQL DATA
BEGIN
   DECLARE cnt int DEFAULT 0;
   select (DATEDIFF(DATE_ADD(curdate(), INTERVAL - DAY(curdate())+ 1 DAY), date_add(curdate()- DAY(curdate())+ 1, INTERVAL -1 MONTH))) ##上月天数
             into cnt ;
   RETURN cnt ;
END;
-- 上月天数 
select fn_last_month_num();


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
26天前
|
存储 Java 关系型数据库
java调用mysql存储过程
在 Java 中调用 MySQL 存储过程主要借助 JDBC(Java Database Connectivity)。其核心原理是通过 JDBC 与 MySQL 建立连接,调用存储过程并处理结果。具体步骤包括:加载 JDBC 驱动、建立数据库连接、创建 CallableStatement 对象、设置存储过程参数并执行调用。此过程实现了 Java 程序与 MySQL 数据库的高效交互。
|
2月前
|
SQL 关系型数据库 MySQL
Mysql-常用函数及其用法总结
以上列举了MySQL中一些常用的函数及其用法。这些函数在日常的数据库操作中非常实用,能够简化数据查询和处理过程,提高开发效率。掌握这些函数的使用方法,可以更高效地处理和分析数据。
82 19
|
3月前
|
SQL 关系型数据库 MySQL
【MySQL基础篇】盘点MySQL常用四大类函数
本文介绍了MySQL中的四大类常用函数:字符串函数、数值函数、日期函数和流程函数。
【MySQL基础篇】盘点MySQL常用四大类函数
|
3月前
|
SQL 关系型数据库 MySQL
MySQL常见函数第二期,你都用过哪些呢 ?
本期介绍了20个常用的MySQL函数,涵盖日期处理(如CURDATE()、DATE_FORMAT())、数学运算(如ABS()、ROUND())、统计分析(如COUNT()、SUM())等,帮助提高SQL查询效率和数据处理能力。希望对大家的学习有所帮助。
102 7
|
3月前
|
关系型数据库 MySQL
MySQL常见函数第一期,你都用过哪些呢 ?
本期介绍10个常用的MySQL函数:字符串连接(CONCAT)、提取子字符串(SUBSTRING)、获取字符串长度(LENGTH)、转换大小写(UPPER、LOWER)、去除空格(TRIM)、替换字符串(REPLACE)、查找子字符串位置(INSTR)、带分隔符的字符串连接(CONCAT_WS)以及获取当前日期时间(NOW)。
93 8
|
3月前
|
数据采集 关系型数据库 MySQL
MySQL常用函数:IF、SUM等用法
本文介绍了MySQL中常用的IF、SUM等函数及其用法,通过具体示例展示了如何利用这些函数进行条件判断、数值计算以及复杂查询。同时,文章还提到了CASE WHEN语句和其他常用函数,如COUNT、AVG、MAX/MIN等,强调了它们在数据统计分析、数据清洗和报表生成中的重要性。
|
3月前
|
关系型数据库 MySQL 数据处理
【MySQL】函数
MySQL 提供了丰富的函数集,涵盖字符串处理、数值运算、日期时间操作和聚合计算等多个方面。这些函数在日常数据库操作中极为重要,通过合理使用这些函数,可以大大提高数据处理和查询的效率。用户还可以通过自定义函数,扩展 MySQL 的功能以满足特定需求。
119 3
|
4月前
|
关系型数据库 MySQL 数据处理
MySQL函数与约束
MySQL 提供了丰富的函数和强大的约束机制,用于数据处理和完整性维护。通过掌握这些工具,可以有效地管理和分析数据库中的数据,确保数据的一致性和准确性。无论是在日常数据查询中使用内置函数,还是在数据库设计中应用各种约束,都是确保数据库系统稳定、高效运行的关键。希望本文对您理解和应用 MySQL 函数与约束有所帮助。
51 1
|
4月前
|
关系型数据库 MySQL Serverless
MySQL函数
最常用的MySQL函数,包括聚合函数,字符串函数,日期时间函数,控制流函数等
60 1
|
4月前
|
存储 SQL NoSQL