<mysql>自定义函数:时间粒度统计的除数(按月)
2016-06-17 15:20
477 查看
如:起始日期 xxxx-03-30
截止日期 xxxx-05-03
当前日期是select中的一个字段,可能在3月份,可能在4月份,可能在5月份。
在3月份:总数/2,4月份:总数/30,5月份:总数/3
DECLARE _res INT ;
DECLARE _except INT ;
/**
* 用一个时间段限制,判断当前日期在计算月平均的时候
* 应当除以的天数(如:3月30号到5月3号,3月份除以2,4月份除以30,5月份除以3)
* cur:当前日期
* start:开始日期
* cur:截止日期
*
* @params cur VARCHAR(19),start VARCHAR(19),end VARCHAR(19)
* 格式:yyyy-mm-dd
* @retrun 除数
*
*/
SET _res = 0 ;
SET _except = -1 ;
IF(DATEDIFF(end,start) < 0) THEN RETURN _except ;
ELSEIF(end='' || start='') THEN RETURN _except ;
ELSEIF(ISNULL(start) || ISNULL(end)) THEN RETURN _except ;
ELSEIF(DATEDIFF(end,cur) < 0 || DATEDIFF(cur,start) < 0 ) THEN RETURN _except ;
ELSEIF(ISNULL(DATE_FORMAT(start,'%Y-%m-%d'))=1
||
ISNULL(DATE_FORMAT(cur,'%Y-%m-%d'))=1
||
ISNULL(DATE_FORMAT(end,'%Y-%m-%d'))=1
) THEN RETURN _except ;
END IF;
-- 1.起始,截止在同一个月
IF (DATEDIFF(end,start) <= DATEDIFF(LAST_DAY(start),start))
THEN SET _res = DATEDIFF(end,start) + 1;
-- 2.起始,截止不在同一个月
ELSE
-- 2.1当前日期在起始月内
IF (DATEDIFF(cur,start) <= DATEDIFF(LAST_DAY(start),start))
THEN SET _res = DATEDIFF(LAST_DAY(cur),start) + 1;
-- 2.2当前日期在结束月内
ELSEIF (DATEDIFF(end,cur) <= (DAY(end) - 1))
THEN SET _res = DAY(end);
-- 2.3当前日期在正常月内
ELSE SET _res = DAY(LAST_DAY(cur));
END IF ;
END IF;
RETURN _res ;
END
SELECT
getDivsForMonIntval('2016-03-31','2016-03-30','2016-05-03') AS _3
,
getDivsForMonIntval('2016-04-18','2016-03-30','2016-05-03') AS _4
,
getDivsForMonIntval('2016-05-01','2016-03-30','2016-05-03') AS _5 ; 结果:
说明:
用一个时间段限制,判断当前日期在计算月平均的时候应当除以的天数。如:起始日期 xxxx-03-30
截止日期 xxxx-05-03
当前日期是select中的一个字段,可能在3月份,可能在4月份,可能在5月份。
在3月份:总数/2,4月份:总数/30,5月份:总数/3
代码:
BEGINDECLARE _res INT ;
DECLARE _except INT ;
/**
* 用一个时间段限制,判断当前日期在计算月平均的时候
* 应当除以的天数(如:3月30号到5月3号,3月份除以2,4月份除以30,5月份除以3)
* cur:当前日期
* start:开始日期
* cur:截止日期
*
* @params cur VARCHAR(19),start VARCHAR(19),end VARCHAR(19)
* 格式:yyyy-mm-dd
* @retrun 除数
*
*/
SET _res = 0 ;
SET _except = -1 ;
IF(DATEDIFF(end,start) < 0) THEN RETURN _except ;
ELSEIF(end='' || start='') THEN RETURN _except ;
ELSEIF(ISNULL(start) || ISNULL(end)) THEN RETURN _except ;
ELSEIF(DATEDIFF(end,cur) < 0 || DATEDIFF(cur,start) < 0 ) THEN RETURN _except ;
ELSEIF(ISNULL(DATE_FORMAT(start,'%Y-%m-%d'))=1
||
ISNULL(DATE_FORMAT(cur,'%Y-%m-%d'))=1
||
ISNULL(DATE_FORMAT(end,'%Y-%m-%d'))=1
) THEN RETURN _except ;
END IF;
-- 1.起始,截止在同一个月
IF (DATEDIFF(end,start) <= DATEDIFF(LAST_DAY(start),start))
THEN SET _res = DATEDIFF(end,start) + 1;
-- 2.起始,截止不在同一个月
ELSE
-- 2.1当前日期在起始月内
IF (DATEDIFF(cur,start) <= DATEDIFF(LAST_DAY(start),start))
THEN SET _res = DATEDIFF(LAST_DAY(cur),start) + 1;
-- 2.2当前日期在结束月内
ELSEIF (DATEDIFF(end,cur) <= (DAY(end) - 1))
THEN SET _res = DAY(end);
-- 2.3当前日期在正常月内
ELSE SET _res = DAY(LAST_DAY(cur));
END IF ;
END IF;
RETURN _res ;
END
调试:
执行sql:SELECT
getDivsForMonIntval('2016-03-31','2016-03-30','2016-05-03') AS _3
,
getDivsForMonIntval('2016-04-18','2016-03-30','2016-05-03') AS _4
,
getDivsForMonIntval('2016-05-01','2016-03-30','2016-05-03') AS _5 ; 结果:
相关文章推荐
- MySQL中的integer 数据类型
- MySQL存储过程
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- MySQL创建用户及权限控制
- MySQL管理数据表
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- MySQL 备份和恢复策略
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列
- Linux下修改MySQL编码的方法
- MySQL Server 日志
- MySQL 安全事宜
- MySQL 备份与恢复