mysql存储过程自动生成周次数据

mysql存储过程自动生成周次数据

1、目的
因项目特殊要求,需按周生成对应批次数据,如周次跨月需要生成两条数据;生成的对应字段如下:
在这里插入图片描述
2、步骤:
2.1、创建数据库表

在这里插入代码片
```CREATE TABLE `temp_week`  (
  `id` int(11) NOT NULL COMMENT '序号',
  `day_desc` date NULL DEFAULT NULL COMMENT '日期',
  `day_of_month` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '当前月',
  `day_of_week` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '当前周',
  `day_of_year` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '当前年',
  `start_week_day` date NULL DEFAULT NULL COMMENT '实际周开始时间',
  `end_week_day` date NULL DEFAULT NULL COMMENT '实际周截止时间',
  `s_week_day` date NULL DEFAULT NULL COMMENT '本月周开始时间',
  `e_week_day` date NULL DEFAULT NULL COMMENT '本月周截止时间',
  `s_year_week` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '提交周',
  `week_id` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '周次ID(年+月+周)',
  `b_year` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '实际周归属年',
  `b_week` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '实际周归属周',
  `last_week_year` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '上周年',
  `next_week_year` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '下周年',
  `last_week` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '上周周次',
  `next_week` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '下周周次',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

2.2、创建存储过程;
sql在获取周次时,一直存在误解,以为一年最后一周,不满足一周,一定是将下年度第一周的数据,累加到上一年度的周次里面,实际是可能累计到下一年的第一周里面;


CREATE PROCEDURE `f_m_dim_day` 
(in startdate date  -- 生成周次开始时间
,in enddate date  -- 生成周次截止时间
,in sindex INT)  -- 序号从什么开始
begin  
  declare LastDayOfMonth VARCHAR(20); -- 上个轮询记录的月份
	declare lastDayOfWeek VARCHAR(20);  -- 上个轮询记录的周次
	declare sWeekDay VARCHAR(20) ;  -- 月度周开始时间
	declare eWeekDay VARCHAR(20) ;  -- 月度周截止时间
	declare startWeekDay VARCHAR(20);  --  当前时间的周一
  declare endtWeekDay VARCHAR(20);   --  当前时间的周日
  SET LastDayOfMonth = ""; 
	SET lastDayOfWeek = ""; 
	
	while startdate <= enddate do
	  -- 当前时间的周一
	  set startWeekDay = date_sub(startdate,INTERVAL WEEKDAY(startdate) + 0 DAY); 
		-- 当前时间的周日
		set endtWeekDay = date_sub(startdate,INTERVAL WEEKDAY(startdate) - 6 DAY);
		
		-- 当前时间所在的月份,或者当前时间所在的周次有一个存在差异,则插入数据
		IF LastDayOfMonth <> DATE_FORMAT(startdate, '%m') ||  lastDayOfWeek <> DATE_FORMAT(startdate, '%v') THEN  
			-- 判断当前时间的月份,是否跟当前时间周一属于同一个月份;
			IF DATE_FORMAT(startdate, '%m') <> DATE_FORMAT (startWeekDay , '%m')THEN  
		    	-- 相同则取本月第一天,当作当前周开始时间
					set sWeekDay =  DATE_FORMAT(startdate,'%Y-%m-01'); 
			else 
					-- 属于同一个月,则取当前时间的周一
					 set sWeekDay =startWeekDay; 
		  END IF;
		  -- 判断当前时间的月份,是否跟当前时间周日属于同一个月份;
			IF DATE_FORMAT(startdate, '%m') <>  DATE_FORMAT(endtWeekDay, '%m')THEN  
					-- 不相同,取本月最后一天,当作本周开始时间
					set eWeekDay =  last_day(startdate);
			else 
				  -- 相同,,则取当前时间的周日
					set eWeekDay =endtWeekDay;
		  END IF;
			-- 插入数据库
			insert into temp_week(id,day_desc,day_of_year,day_of_month,day_of_week,start_week_day,end_week_day,s_week_day,e_week_day,s_year_week,week_id,b_year,b_week,last_week_year,last_week,next_week_year,next_week) 
				values(
				sindex, -- 序号
				startdate,-- 日期
				DATE_FORMAT(startdate, '%x'), -- 当前年
				DATE_FORMAT(startdate, '%m'),-- 当前月
				DATE_FORMAT(startWeekDay, '%v')-- 当前周
				,startWeekDay, -- 实际周开始时间
				 endtWeekDay,-- 实际周截止时间
				 sWeekDay, -- 本月周开始时间
				 eWeekDay,-- 本月周截止时间
				 CONCAT(DATE_FORMAT(DATE_ADD(startdate,INTERVAL -14 day) , '%x'), -- 提交年
				 DATE_FORMAT(DATE_ADD(startdate,INTERVAL -14 day)  , '%v')), -- 提交周
				 CONCAT(DATE_FORMAT(startdate, '%x'),  DATE_FORMAT(startdate, '%m'), DATE_FORMAT(startWeekDay, '%v')), -- 周次ID(年+月+周)
				 DATE_FORMAT(startWeekDay, '%x'), -- 实际周归属年
				 DATE_FORMAT(startWeekDay, '%v'), -- 实际周归属周
				 DATE_FORMAT(DATE_ADD(startdate,INTERVAL -7 day) , '%x'), -- 上周年
				 DATE_FORMAT(DATE_ADD(startdate,INTERVAL -7 day) , '%v'), -- 上周周次
				 DATE_FORMAT(DATE_ADD(startdate,INTERVAL 7 day) , '%x'), -- 下周年
				 DATE_FORMAT(DATE_ADD(startdate,INTERVAL 7 day) , '%v') -- 下周周次
				);
			-- 本次月份,本次周次存入临时字段
			set LastDayOfMonth = DATE_FORMAT(startdate, '%m');
			set lastDayOfWeek =DATE_FORMAT(startdate, '%v') ; 
			-- 序号自动增加1
			set sindex = sindex+1;
		 END IF;
	  -- 时间增加1,遍历
		set startdate = ADDDATE(startdate,1) ;
	end while;
end  

3、呈现效果
执行存储过程,按你实际需要生成的数据,填写值;
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

李迪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值