有表: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 '02000' 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