您的位置:首页 > 数据库 > MySQL

<mysql>自定义函数:时间粒度统计的除数(按月)

2016-06-17 15:20 477 查看


说明:

用一个时间段限制,判断当前日期在计算月平均的时候应当除以的天数。

如:起始日期 xxxx-03-30

       截止日期 xxxx-05-03

       当前日期是select中的一个字段,可能在3月份,可能在4月份,可能在5月份。

       在3月份:总数/2,4月份:总数/30,5月份:总数/3

代码:

BEGIN
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

调试:

    执行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 函数