MySql 存储过程插入年月日

参数:开始年份,结束年份
过程说明:生成年月数据插入期间有中,若发现已经存在某年的数据则跳过。

DROP PROCEDURE IF EXISTS createPayPeriod;
DELIMITER //
CREATE PROCEDURE createPayPeriod(IN START_YEAR INT,IN END_YEAR int)
  BEGIN
    DECLARE v int; 
    declare max_year int;

    DECLARE c INT;
    set v=START_YEAR;
        set max_year = END_YEAR;
    LOOP_LABLE:LOOP
      IF v<=END_YEAR THEN 
                select count(1) into c from pay_period t where t.period_year = v;
                if c>0 then 
                    SET v=v+1;
                    ITERATE LOOP_LABLE;
                end if;
                INSERT INTO pay_period (pay_period_id,period_name,period_year,period_month)VALUES(null,concat(v,'-01'),v,'01');
                INSERT INTO pay_period (pay_period_id,period_name,period_year,period_month)VALUES(null,concat(v,'-02'),v,'02');
                INSERT INTO pay_period (pay_period_id,period_name,period_year,period_month)VALUES(null,concat(v,'-03'),v,'03');
                INSERT INTO pay_period (pay_period_id,period_name,period_year,period_month)VALUES(null,concat(v,'-04'),v,'04');
                INSERT INTO pay_period (pay_period_id,period_name,period_year,period_month)VALUES(null,concat(v,'-05'),v,'05');
                INSERT INTO pay_period (pay_period_id,period_name,period_year,period_month)VALUES(null,concat(v,'-06'),v,'06');
                INSERT INTO pay_period (pay_period_id,period_name,period_year,period_month)VALUES(null,concat(v,'-07'),v,'07');
                INSERT INTO pay_period (pay_period_id,period_name,period_year,period_month)VALUES(null,concat(v,'-08'),v,'08');
                INSERT INTO pay_period (pay_period_id,period_name,period_year,period_month)VALUES(null,concat(v,'-09'),v,'09');
                INSERT INTO pay_period (pay_period_id,period_name,period_year,period_month)VALUES(null,concat(v,'-10'),v,'10');
                INSERT INTO pay_period (pay_period_id,period_name,period_year,period_month)VALUES(null,concat(v,'-11'),v,'11');
                INSERT INTO pay_period (pay_period_id,period_name,period_year,period_month)VALUES(null,concat(v,'-12'),v,'12');


        SET v=v+1;
        ITERATE LOOP_LABLE;
      END IF;
     IF v>END_YEAR THEN
        LEAVE LOOP_LABLE;
      END IF;
    END LOOP;


  END ;
  //
DELIMITER ;

在navicat中执行存储过程



SET @start_year = 2020;

set @end_year = 2100;

CALL createPayPeriod (@start_year ,@end_year);

改进版

DROP PROCEDURE IF EXISTS createPayPeriod2;
DELIMITER //
CREATE PROCEDURE createPayPeriod2(IN START_YEAR INT,IN END_YEAR int)
  BEGIN
    DECLARE v int; 
        declare max_year int;
        declare v_month int;
        DECLARE s_month varchar(7);
        DECLARE c INT;
    set v=START_YEAR;
        set max_year = END_YEAR;
    LOOP_LABLE:LOOP
      IF v<=END_YEAR THEN 
                set v_month = 1;

                LOOP_LABLE2: LOOP
                    IF v_month <= 12 THEN 
                        select count(1) into c from pay_period t where t.period_year = v AND t.period_month = v_month;
                        if c>0 THEN 
                            SET v_month=v_month+1;
                            ITERATE LOOP_LABLE2;
                        END IF;
                        select concat(v,'-',v_month) into s_month;
                        if v_month < 10 THEN
                            select concat(v,'-0',v_month) into s_month;
                        END IF;

                        INSERT INTO pay_period (pay_period_id,period_name,period_year,period_month)VALUES(null,s_month,v,v_month);

                        SET v_month=v_month+1;
                        ITERATE LOOP_LABLE2;
                END IF;
                IF v_month > 12 THEN
                    LEAVE LOOP_LABLE2;
                END IF;
                END LOOP;


        SET v=v+1;
        ITERATE LOOP_LABLE;
      END IF;
     IF v>END_YEAR THEN
        LEAVE LOOP_LABLE;
      END IF;
    END LOOP;


  END ;
  //
DELIMITER ;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wolf犭良

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值