自定義函式 時間粒度統計的除數(按月)

2021-07-13 15:41:31 字數 1915 閱讀 1731



用乙個時間段限制,判斷當前日期在計算月平均的時候應當除以的天數。

如:起始日期 ***x-03-30

截止日期 ***x-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 按自定義的規則排序

有些時候取資料時的排序規則需要為自己的指定規則,如 1 3 2 0這種,所以需要在取資料時指定排序規則,具體方法如下 select user from user where user status in 0,1,2,3 order by field user status 1,0,2,3 這樣就可以...

統計素數並求和(自定義函式法)

7 6 統計素數並求和 10分 本題要求統計給定整數m和n區間內素數的個數並對它們求和。輸入格式 輸入在一行中給出兩個正整數m和n 1 m n 500 輸出格式 在一行中順序輸出m和n區間內素數的個數以及它們的和,數字間以空格分隔。輸入樣例 10 31 輸出樣例 7 143 為了以後的方便,本題採用...

自定義的列印函式

void userdefinedprintfun char format,int i,else if format 1 format d else if format 1 format f va end arg ptr return 如果採用下面三種方法呼叫,合法合理 userdefinedprin...