生成一段时间按照频率(每一个月、两个月、一个季、半年、一年)的计划的开始时间和结束时间

根据频率生成从开始时间到结束时间的范围内的计划(如果开始时间是从1号开始使用)

-- 频率:一个月,两个月,一个季,半年,一年对应1,2,3,6,12,${frequency3}S
-- 开始时间:参数   ${starttime}S
-- 结束时间:参数   ${endtime}S
  1. 查询这这一段计划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
 
 
  1. 查询这一段时间按照频率生成的计划
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开始时使用)

  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
  1. 查询这一段时间按照频率生成的计划
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         -- 这一段查询最大的结束时间的下月第一天和结束时间

如果开始时间和结束时间小于频率规定的范围使用

如果开始时间和结束时间小于频率规定的范围时,直接取选择的开始时间和结束时间作为生成的计划的范围。。。

例子:不满足一个月的每两个月的开始时间和结束时间

效果图

posted @   ..L  阅读(91)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示