CREATE PROCEDURE `DATE_CRETAE`(IN `S_YEAR` int,IN `E_YEAR` int,OUT v_msg VARCHAR(1000),out v_code INT)
BEGIN
DECLARE A_YEAR INT;-- 年
DECLARE A_MONTH INT;-- 月
DECLARE A_F_DAY INT;-- 每月第一天
DECLARE A_L_DAY INT;-- 每月最后一天
DECLARE ADAY INT;-- 天
DECLARE M_SQL VARCHAR(1000);
DECLARE isholiday int;-- 是否周末
DECLARE is_workdate int;-- 是否工作日
DECLARE prc_name VARCHAR(100);-- 过程名称
set prc_name = 'DATE_CRETAE';
-- 清除日历表中所有的数据,也可用truncate table
SET M_SQL = 'DELETE FROM rili WHERE 1=1;';
SET @SQL = M_SQL;
PREPARE STMT FROM @SQL;
EXECUTE STMT;
SET M_SQL = 'DELETE FROM year_month_day WHERE 1=1;';
SET @SQL = M_SQL;
PREPARE STMT FROM @SQL;
EXECUTE STMT;
COMMIT;
SET A_YEAR = s_year; -- 开始年
while a_year <= E_YEAR DO -- 年,循环,判断开始年份是否小于结束年份
set a_month = 1;
while a_month <= 12 do -- 月
set a_f_day = CONCAT(a_year,LPAD(a_month,2,0),'01');
set a_L_day = DATE_SUB(DATE_ADD(CAST(a_f_day as DATE),INTERVAL 1 MONTH) ,INTERVAL 1 day);
while a_f_day <= a_L_day DO -- 日
SET ADAY = A_F_DAY;
IF DATE_FORMAT(CAST(aday as date),'%w') = 0 THEN -- 判断是否为周天
set isholiday = 1;
set is_workdate = 0;
ELSEIF DATE_FORMAT(CAST(aday as date),'%w') = 6 THEN -- 判断是否为周六
set isholiday = 1;
set is_workdate = 0;
ELSE set isholiday = 0;
set is_workdate = 1;
end IF;
insert into rili(aday,is_holiday)
value(ADAY,isholiday);
insert into year_month_day(ayear,amonth,aday,adate,is_workdate)
value(a_year,a_month,SUBSTR(aday,7),aday,is_workdate);
SET A_F_DAY = A_F_DAY + 1;
END WHILE;
SET v_msg = concat(a_year,'年',a_month,'月,运行成功');
set v_code = 0;
-- 写入日志
insert into prc_log(prc_name,v_msg,v_code)
value(prc_name,v_msg,v_code);
SET A_MONTH = A_MONTH + 1;
END WHILE;
SET A_YEAR = A_YEAR + 1;
END WHILE;
END