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

1、目的

因项目特殊要求,需按周生成对应批次数据,如周次跨月需要生成两条数据;生成的对应字段如下:

mysql 每周开始时间 mysql周期表_数据库


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、呈现效果

执行存储过程,按你实际需要生成的数据,填写值;

mysql 每周开始时间 mysql周期表_ci_02


mysql 每周开始时间 mysql周期表_mysql_03