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



说明:

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

如:起始日期 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 ;
    结果:

   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值