統計在某月某時間段工作的天數,除去週末
阿新 • • 發佈:2019-02-06
以5月份為例,利用自定義的函式來統計
DROP FUNCTION IF EXISTS f_c; CREATE FUNCTION f_c (start_date date, end_date date ) RETURNS int BEGIN DECLARE start_date2 date; DECLARE end_date2 date; DECLARE i int; DECLARE j int; set i=1; set j=0; if start_date>=str_to_date('2017-5-1','%Y-%m-%d') and end_date<=str_to_date('2017-5-31','%Y-%m-%d') then set start_date2=start_date ,end_date2=end_date; end if; if start_date<str_to_date('2017-5-1','%Y-%m-%d') and end_date<=str_to_date('2017-5-31','%Y-%m-%d') and end_date>=str_to_date('2017-5-1','%Y-%m-%d') then set start_date2=str_to_date('2017-5-1','%Y-%m-%d') ,end_date2=end_date; end if; if start_date>=str_to_date('2017-5-1','%Y-%m-%d') and start_date<str_to_date('2017-5-31','%Y-%m-%d') and end_date>str_to_date('2017-5-31','%Y-%m-%d') then set start_date2=start_date ,end_date2=str_to_date('2017-5-31','%Y-%m-%d'); end if; if start_date<str_to_date('2017-5-1','%Y-%m-%d') and end_date>str_to_date('2017-5-31','%Y-%m-%d') then set start_date2=str_to_date('2017-5-1','%Y-%m-%d') ,end_date2=str_to_date('2017-5-31','%Y-%m-%d'); end if; while start_date2< end_date2 do if DAYOFWEEK(start_date2) = 1 or DAYOFWEEK(start_date2) = 7 THEN set j=j+1; end if; set start_date2=start_date2+1; end while; RETURN j; end; -- select f_c(str_to_date('2017-5-1','%Y-%m-%d'),str_to_date('2017-5-10','%Y-%m-%d') )
上面這個有點問題又修改了下:
DROP FUNCTION IF EXISTS f_c; CREATE FUNCTION f_c (start_date date, end_date date ) RETURNS int BEGIN DECLARE start_date2 date; DECLARE end_date2 date; DECLARE i int; DECLARE j int; set i=1; set j=0; if DATE_FORMAT(start_date,'%Y-%m-%d') >=str_to_date('2017-5-1','%Y-%m-%d') and DATE_FORMAT(end_date,'%Y-%m-%d') <=str_to_date('2017-5-31','%Y-%m-%d') then set start_date2=DATE_FORMAT(start_date,'%Y-%m-%d') ,end_date2=DATE_FORMAT(end_date,'%Y-%m-%d') ; end if; if start_date<str_to_date('2017-5-1','%Y-%m-%d') and end_date<=str_to_date('2017-5-31','%Y-%m-%d') and end_date>=str_to_date('2017-5-1','%Y-%m-%d') then set start_date2=str_to_date('2017-5-1','%Y-%m-%d') ,end_date2=end_date; end if; if start_date>=str_to_date('2017-5-1','%Y-%m-%d') and start_date<=str_to_date('2017-5-31','%Y-%m-%d') and end_date>str_to_date('2017-5-31','%Y-%m-%d') then set start_date2=start_date ,end_date2=str_to_date('2017-5-31','%Y-%m-%d'); end if; if start_date<str_to_date('2017-5-1','%Y-%m-%d') and end_date>str_to_date('2017-5-31','%Y-%m-%d') then set start_date2=str_to_date('2017-5-1','%Y-%m-%d') ,end_date2=str_to_date('2017-5-31','%Y-%m-%d'); end if; while start_date2<= end_date2 do if DAYOFWEEK(start_date2) = 2 or DAYOFWEEK(start_date2) = 3 or DAYOFWEEK(start_date2) = 4 or DAYOFWEEK(start_date2) = 5 or DAYOFWEEK(start_date2) = 6 THEN set j=j+1; end if; set start_date2=date_add(start_date2, interval 1 day); end while; RETURN j; end;
下面是專案需求中具體運用到上述sql自定義函式的例項