生成一段时间按照频率(每一个月、两个月、一个季、半年、一年)的计划的开始时间和结束时间
根据频率生成从开始时间到结束时间的范围内的计划(如果开始时间是从1号开始使用)
-- 频率:一个月,两个月,一个季,半年,一年对应1,2,3,6,12,${frequency3}S
-- 开始时间:参数 ${starttime}S
-- 结束时间:参数 ${endtime}S
- 查询这这一段计划endtime的最大时间
select max(aa.endtime) -- R.endtime
from
(select CONCAT(DATE_FORMAT(date_add(${starttime}S, interval row+1 MONTH),'%Y-%m'),'-01') as startdate, LAST_DAY(CONCAT(DATE_FORMAT(date_add(${starttime}S, interval row+${frequency3}S MONTH),'%Y-%m'),'-01')) as endtime,${frequency3}S from
(
SELECT @row := @row + ${frequency3}S as row FROM
(select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t,
(select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t2,
(SELECT @row:=-1) r
) se
where DATE_FORMAT(date_add(${starttime}S, interval row MONTH),'%Y-%m') <= DATE_FORMAT(DATE_ADD(${endtime}S,interval -(${frequency3}S+1) month),'%Y-%m')) aa
- 查询这一段时间按照频率生成的计划
select DATE_FORMAT(${starttime}S,'%Y-%m-%d'),LAST_DAY(DATE_FORMAT(DATE_ADD(${starttime}S,INTERVAL ${frequency3}S-1 month),'%Y-%m-%d')),${frequency3}S -- 这一段查询开始时间和频率计算的当月的最后一天,两个时间
union all
select CONCAT(DATE_FORMAT(date_add(${starttime}S, interval row+1 MONTH),'%Y-%m'),'-01') as startdate, LAST_DAY(CONCAT(DATE_FORMAT(date_add(${starttime}S, interval row+${frequency3}S MONTH),'%Y-%m'),'-01')) as endtime,${frequency3}S from
(
SELECT @row := @row + ${frequency3}S as row FROM
(select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t,
(select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t2,
(SELECT @row:=-1) r
) se
where DATE_FORMAT(date_add(${starttime}S, interval row MONTH),'%Y-%m') <= DATE_FORMAT(DATE_ADD(${endtime}S,interval -(${frequency3}S+1) month),'%Y-%m') -- 这一段查询每一段频率的开始时间和结束时间,按照整段频率计算,比如当月的一月一号到频率当月的最后一天
union all
select CONCAT(DATE_FORMAT(date_add(case when max(${R.endtime}S) !=''then max(${R.endtime}S) when max(${R.endtime}S) is null then LAST_DAY(DATE_FORMAT(DATE_ADD(${starttime}S,INTERVAL ${frequency3}S-1 month),'%Y-%m-%d'))end , interval 1 MONTH),'%Y-%m'),'-01'),DATE_FORMAT(${endtime}S,'%Y-%m-%d'),${frequency3}S -- 这一段查询最大的结束时间的下月第一天和结束时间
根据计划,首月不足一个月的情况,生成计划时需要剔除首月的时间,从下个月的1号开始生成计划(不是从当月的1.1开始时使用)
- 查询这这一段计划endtime的最大时间
select max(aa.endtime) -- R.endtime
from
(select CONCAT(DATE_FORMAT(date_add(${starttime}S, interval row+2 MONTH),'%Y-%m'),'-01') as startdate, LAST_DAY(CONCAT(DATE_FORMAT(date_add(${starttime}S, interval row+${frequency3}S+1 MONTH),'%Y-%m'),'-01')) as endtime,${frequency3}S from
(
SELECT @row := @row + ${frequency3}S as row FROM
(select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t,
(select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t2,
(SELECT @row:=-1) r
) se
where DATE_FORMAT(date_add(${starttime}S, interval row+1 MONTH),'%Y-%m') <= DATE_FORMAT(DATE_ADD(${endtime}S,interval -(${frequency3}S+1) month),'%Y-%m')) aa
- 查询这一段时间按照频率生成的计划
select CONCAT(DATE_FORMAT(DATE_ADD(${starttime}S,INTERVAL 1 month),'%Y-%m'),'-01'),LAST_DAY(DATE_FORMAT(DATE_ADD(${starttime}S,INTERVAL ${frequency3}S month),'%Y-%m-%d')),${frequency3}S
-- -- 这一段查询开始时间的下个月1号开始到频率结束的当月的最后一天。
union all
select CONCAT(DATE_FORMAT(date_add(${starttime}S, interval row+2 MONTH),'%Y-%m'),'-01') as startdate, LAST_DAY(CONCAT(DATE_FORMAT(date_add(${starttime}S, interval row+${frequency3}S+1 MONTH),'%Y-%m'),'-01')) as endtime,${frequency3}S from
(
SELECT @row := @row + ${frequency3}S as row FROM
(select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t,
(select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t2,
(SELECT @row:=-1) r
) se
where DATE_FORMAT(date_add(${starttime}S, interval row+1 MONTH),'%Y-%m') <= DATE_FORMAT(DATE_ADD(${endtime}S,interval -(${frequency3}S+1) month),'%Y-%m') -- 这一段查询每一段频率的开始时间和结束时间,按照整段频率计算,比如当月的一月一号到频率当月的最后一天
union all
select CONCAT(DATE_FORMAT(date_add(case when max(${R.endtime}S) !=''then max(${R.endtime}S) when max(${R.endtime}S) is null then LAST_DAY(DATE_FORMAT(DATE_ADD(${starttime}S,INTERVAL -(${frequency3}S+1) month),'%Y-%m-%d'))end , interval 1 MONTH),'%Y-%m'),'-01'),DATE_FORMAT(${endtime}S,'%Y-%m-%d'),${frequency3}S -- 这一段查询最大的结束时间的下月第一天和结束时间
如果开始时间和结束时间小于频率规定的范围使用
如果开始时间和结束时间小于频率规定的范围时,直接取选择的开始时间和结束时间作为生成的计划的范围。。。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步