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、呈现效果
执行存储过程,按你实际需要生成的数据,填写值;