CREATE PROCEDURE `p_preserve_his`(in months int)
BEGIN
Declare lastMonth date;
Declare lastdt int;
Declare statisdate int;
DECLARE i int;
DECLARE loop_index int DEFAULT 0;
DECLARE done boolean DEFAULT FALSE;
DECLARE need_delete boolean DEFAULT TRUE;
DECLARE cur CURSOR FOR select distinct dt from $table_name order by dt DESC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH next from cur INTO statisdate;
#结束循环
IF done THEN
LEAVE read_loop;
END IF;
set loop_index = loop_index + 1;
#最大日期
if loop_index = 1 then
ITERATE read_loop;
end if;
#设置一个标记
outer_label: BEGIN
set need_delete = true;
SET i = 1;
WHILE i <= months DO
select last_day(date_add(curdate()-day(curdate())+1,interval -i month )) into lastMonth;
Set lastdt
= DATE_FORMAT(lastMonth,'%Y%m%d');
if statisdate = lastdt then
set need_delete = false;
#需要保留
LEAVE outer_label;
end if;
SET i = i + 1;
END WHILE;
if need_delete then
#不需要保留
delete from $table_name where dt = statisdate;
commit;
end if;
END outer_label;
END LOOP;
CLOSE cur;
END
本文介绍了一个MySQL存储过程,用于在数据库中保留每月末的数据以及最新的记录。通过循环遍历表中的日期,对比当前月份与指定保留月份数,决定是否删除中间的旧数据。
1557

被折叠的 条评论
为什么被折叠?



