更新MYSQL生成日历表,支持跨年份 存储过程
更新MYSQL生成日历表,支持跨年
代码
CREATE DEFINER = 'root'@'localhost' PROCEDURE `proc_ym`(IN sdate DATE, IN edate DATE)
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
begin
#1.变量声明
declare sourcedate date; #开始时间
declare targetdate date; #结束时间
declare indexdate date; #当前时间,充当临时变量
declare index_month int; #循环体内的当前索引时间的月
declare index_year int; #循环体内的当前索引时间的年
declare step_year_month char(20);
#2.创建临时表
#2.1创建一个存储时间日历的临时表
drop table if exists tmp_ym_tb; #如果存在临时表,先删除临时表
create temporary table tmp_ym_tb( #创建临时表,字段 rowid,ym
rowid bigint auto_increment primary key, #临时表主键
ym varchar(10) #年月
);
#3.初始化变量
set sourcedate = sdate; #初始化开始日期
set targetdate = edate; #初始化结束日期
set indexdate = sourcedate; #当前索引从初始化日期开
set index_month = month(indexdate); #初始化当前索引的月份,后面会随着循环发生变化
set index_year = year(indexdate); #初始化当前索引的年份,后面会随着循环发生变化
/*
select date_format(indexdate,"%Y-%m") as ym; 返回 2009-02
select date_format(indexdate,"%y-%m") as ym; 返回 09-02
*/
#4.循环将某个时间段内的年月添加到前面创建的临时表
while indexdate <= targetdate do #如果当前索引时间小于等于结束时间,就将年和月记录到临时表去
begin
set index_month = month(indexdate);
set step_year_month = concat(cast(index_year as char) ,'-',cast(index_month as char),'-01');
insert tmp_ym_tb(ym) values(step_year_month); #将年月插入到临时表
if(index_month=12) then
set index_year = index_year + 1;
set index_month = 0; #重新从0开始
end if;
set step_year_month = concat(cast(index_year as char) ,'-',cast((index_month+1) as char),'-01');
set indexdate = date(step_year_month);
end;
end while;
end
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
begin
#1.变量声明
declare sourcedate date; #开始时间
declare targetdate date; #结束时间
declare indexdate date; #当前时间,充当临时变量
declare index_month int; #循环体内的当前索引时间的月
declare index_year int; #循环体内的当前索引时间的年
declare step_year_month char(20);
#2.创建临时表
#2.1创建一个存储时间日历的临时表
drop table if exists tmp_ym_tb; #如果存在临时表,先删除临时表
create temporary table tmp_ym_tb( #创建临时表,字段 rowid,ym
rowid bigint auto_increment primary key, #临时表主键
ym varchar(10) #年月
);
#3.初始化变量
set sourcedate = sdate; #初始化开始日期
set targetdate = edate; #初始化结束日期
set indexdate = sourcedate; #当前索引从初始化日期开
set index_month = month(indexdate); #初始化当前索引的月份,后面会随着循环发生变化
set index_year = year(indexdate); #初始化当前索引的年份,后面会随着循环发生变化
/*
select date_format(indexdate,"%Y-%m") as ym; 返回 2009-02
select date_format(indexdate,"%y-%m") as ym; 返回 09-02
*/
#4.循环将某个时间段内的年月添加到前面创建的临时表
while indexdate <= targetdate do #如果当前索引时间小于等于结束时间,就将年和月记录到临时表去
begin
set index_month = month(indexdate);
set step_year_month = concat(cast(index_year as char) ,'-',cast(index_month as char),'-01');
insert tmp_ym_tb(ym) values(step_year_month); #将年月插入到临时表
if(index_month=12) then
set index_year = index_year + 1;
set index_month = 0; #重新从0开始
end if;
set step_year_month = concat(cast(index_year as char) ,'-',cast((index_month+1) as char),'-01');
set indexdate = date(step_year_month);
end;
end while;
end