MySQL存储过程生成某些年份的具体日期以及判断具体某一天是否为周末

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

过程调用

call date_cretae(2012,2013,@aaa,@bbb);
select @aaa;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值