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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 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();


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
存储 关系型数据库 MySQL
环比、环比增长率、同比、同比增长率 ,占比,Mysql 8.0 实例(最简单的方法之一)(sample database classicmodels _No.2 )
环比、环比增长率、同比、同比增长率 ,占比,Mysql 8.0 实例(最简单的方法之一)(sample database classicmodels _No.2 )
89 1
|
1月前
|
SQL 前端开发 关系型数据库
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
46 0
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
|
13天前
|
关系型数据库 MySQL Serverless
MySQL函数
最常用的MySQL函数,包括聚合函数,字符串函数,日期时间函数,控制流函数等
|
7天前
|
关系型数据库 MySQL 数据库
【赵渝强老师】启动与关闭MySQL数据库实例
MySQL数据库安装完成后,可以通过命令脚本启动、查看状态、配置开机自启、查看自启列表及关闭数据库。本文提供了详细的操作步骤和示例代码,并附有视频讲解。
|
16天前
|
SQL NoSQL 关系型数据库
|
27天前
|
关系型数据库 MySQL 数据库
mysql中tonumber函数使用要注意什么
在处理这类转换操作时,考虑周全,利用提供的高性能云服务器资源,可以进一步提升数据库处理效率,确保数据操作的稳定性和安全性,尤其是在处理大量数据转换和运算密集型应用时。
84 0
|
30天前
|
存储 关系型数据库 MySQL
mysql 8.0 的 建表 和八种 建表引擎实例
mysql 8.0 的 建表 和八种 建表引擎实例
20 0
|
1月前
|
关系型数据库 MySQL 数据处理
企业级应用 mysql 日期函数变量,干货已整理
本文详细介绍了如何在MySQL8.0中使用DATE_FORMAT函数进行日期格式的转换,包括当日、昨日及不同时间段的数据获取,并提供了实际的ETL应用场景和注意事项,有助于提升数据处理的灵活性和一致性。
40 0
|
1月前
|
存储 关系型数据库 MySQL
Key_Value 形式 存储_5级省市城乡划分代码 (mysql 8.0 实例)
本文介绍了如何使用MySQL8.0数据库中的Key_Value形式存储全国统计用区划代码和城乡划分代码(5级),包括导入数据、通过数学函数提取省市区信息,以及查询5级行政区划的详细数据。
30 0
|
1月前
|
算法 关系型数据库 MySQL
复购率 mysql 实例(sample database classicmodels _No.1 )
复购率 mysql 实例(sample database classicmodels _No.1 )
27 0