使用mysql存储过程生成目标时间段内的每一天的日期

输入两个日期类型的字符串得到该段时间内的每一天的日期

  • 先看下效果
    • 实现步骤

先看下效果

输入参数20181010 20181101
使用mysql存储过程生成目标时间段内的每一天的日期_第1张图片
结果图
使用mysql存储过程生成目标时间段内的每一天的日期_第2张图片

实现步骤

上代码

CREATE DEFINER=`root`@`localhost` PROCEDURE `date_dowhile`(i_begindate VARCHAR(20), i_enddate VARCHAR(20))
BEGIN
	#Routine body goes here...
	declare v_firstday date;
	declare v_lastday  date;
	select date_format(i_begindate,'%Y-%m-%d'),date_format(i_enddate,'%Y-%m-%d') into v_firstday,v_lastday;
   DROP temporary TABLE IF EXISTS tmp_t;
	 create temporary table if not exists tmp_t(-- 创建临时表保存查询的结果集中的需要的数据
										  DATE date 
											);
 
	WHILE v_firstday <= v_lastday DO
		INSERT IGNORE INTO tmp_t(DATE) VALUE (v_firstday) ;
		SET v_firstday = v_firstday + INTERVAL 1 DAY ;
	END WHILE ; 
	select DATE FROM tmp_t;
END

首先,参数这里默认为in类型,声明两个日期字符串类型的参数i_begindate 和i_enddate 代表开始时间和结束时间,可变长度20足够了。

然后,在函数体内 声明两个局部变量 v_firstday和v_lastday ,注意这里要使用的是date类型。

使用date_format()函数将输入的两个字符串参数转为年月日形式的date类型存入变量 v_firstday和v_lastday。(select into的用法不清楚的可以去看下菜鸟教程http://www.runoob.com/sql/sql-select-into.html) 。此时可以在后面加一句select v_firstday,v_lastday;可以明确看的字符串参数已经被转为我们需要的日期格式了。使用mysql存储过程生成目标时间段内的每一天的日期_第3张图片
好了 ,到这里我们有了开始时间和结束时间,接下来就是要循环来得到这个时间段内的每一天就行了。但是得到后怎么返回这些结果呢?在循环体中每次查询一次?这样返回的结果集数量太多了。所有这里考虑使用临时表来保存在循环中的每一天,待循环结束直接查询临时表的数据即可得到这个结果集。
所以我们接下来创建一个临时表
DROP temporary TABLE IF EXISTS tmp_t;
create temporary table if not exists tmp_t(-- 创建临时表保存查询的结果集中的需要的数据
DATE date
);
和普通表的语法没多大区别。

终于来到循环这一步了,
WHILE v_firstday <= v_lastday DO #当开始时间小于等于结束时间时执行下面的操作
INSERT IGNORE INTO tmp_t(DATE) VALUE (v_firstday) ; #将v_firstday的日期插入临时表的DATE字段内
SET v_firstday = v_firstday + INTERVAL 1 DAY ; #将开始时间的日期加一天,继续下一次循环
END WHILE ; #当开始时间大于结束时间时结束循环 。

循环结束了 ,我们的临时表里每次循环也插入了每次循环时v_firstday的日期。
接下来 使用 select DATE FROM tmp_t; 就拿到了表中的数据,和普通表的查询语句没有区别简直爽爆了。

总结一下,要对mysql的临时表 ,局部变量,以及循环的使用和日期函数的使用有一定了解。
好了,溜了溜了~~~~~~~~~~~~

你可能感兴趣的:(数据库)