為女票寫的計算工作時間的SQL

2022-04-10 10:18:20 字數 3736 閱讀 3879

排除非工作時間、非工作日後,計算工作時間,**如下:

-- 刪除函式

drop function if exists calculateworkingtime;

set @workstarttime='09:30:00';

set @workendtime='18:30:00';

-- 建立函式

--/create function calculateworkingtime(startdate datetime,enddate datetime)

returns decimal(32,4)

begin

declare intnum int(255) default 0;

declare decimalnum decimal(32,4) default 0.000;

declare workstarttimehour decimal(32,4) default 0.000;

declare workendtimehour decimal(32,4) default 0.000;

declare currentday int(10) default 0;

declare temptimehour decimal(32,4) default 0.000;

-- declare temp varchar(2048) default '';

-- deal starttime and endtime is nonworkdays

set startdate = (case when weekday(startdate)=5 then concat(date(timestampadd(day,2,startdate)),' ',@workstarttime) when weekday(startdate)=6 then concat(date(timestampadd(day,1,startdate)),' ',@workstarttime) else startdate end);

set enddate = (case when weekday(enddate)=5 then concat(date(timestampadd(day,-1,enddate)),' ',@workendtime) when weekday(enddate)=6 then concat(date(timestampadd(day,-2,enddate)),' ',@workendtime) else enddate end);

-- set temp = concat(temp,' ',startdate,';',enddate);

if startdate < enddate then

-- deal starttime and endtime is nonworktime

if time(startdate)<=@workstarttime then

set startdate = concat(date(startdate),' ', @workstarttime);

elseif date(startdate) < date(enddate) and time(startdate)>@workendtime then

set startdate = concat(date(date_add(startdate, interval 1 day)),' ',@workstarttime);

end if;

if time(enddate)>=@workendtime then

set enddate = concat(date(enddate),' ',@workendtime);

elseif date(startdate) < date(enddate) and time(enddate)<@workstarttime then

set enddate = concat(date(date_add(enddate, interval -1 day)),' ',@workendtime);

end if;

-- calculate time diff

set decimalnum = (minute(enddate)*60+second(enddate)-minute(startdate)*60-second(startdate))/3600;

end if;

-- calculate work time second

set workstarttimehour = hour(@workstarttime)+minute(@workstarttime)/60+second(@workstarttime)/3600;

set workendtimehour = hour(@workendtime)+minute(@workendtime)/60+second(@workendtime)/3600;

-- while (floor((unix_timestamp(enddate) - unix_timestamp(startdate))/3600) > 0) do

while ((floor(unix_timestamp(enddate)/3600) - floor(unix_timestamp(startdate)/3600)) > 0) do

set temptimehour = hour(startdate)+minute(startdate)/60+second(startdate)/3600;

if workstarttimehour <= temptimehour and temptimehour < workendtimehour then

-- set temp = concat(temp,' ',temptimehour,';');

set intnum = (case when weekday(startdate)=5 or weekday(startdate)=6 then intnum else intnum+1 end);

end if;

set startdate = timestampadd(hour,1,startdate);

end while;

set decimalnum = intnum + decimalnum;

-- concat(decimalnum,';',workstarttimehour,' ',workendtimehour,' ',intnum,';;;',temp);

return decimalnum;

end

/-- select calculateworkingtime('2017-02-17 07:30:00','2017-02-21 17:39:00');

select transport_id,create_at1,create_at2,create_at3, calculateworkingtime(create_at1,create_at2), calculateworkingtime(create_at2,create_at3),calculateworkingtime(create_at1,create_at3) from newtable;

select transport_id,calculateworkingtime(create_at1,create_at2) from newtable;

說明:第一次實現這種需求,當初寫的時候又比較趕,寫完後,發現,雖然功能實現了,但還有好多地方可以調優 

女票是搞資料運營的,經常需要統計員工的工作時間;聽女票說,這段sql**統計時好像有些問題,但還沒來的急分析原因呢;女票又有新需求來了,不僅需要將非工作時間、非工作日去掉,還需要將節假日去掉   我將上面**重構,實現想要功能(重構後的**就不放出了)

】。

java 工作日,工作時間內的時間增量計算

author xiaogang date 2018 7 19 18 01 public class dateutil catch parseexception e 工作日內時間加法計算 param date return public static date addinworkdate date d...

不要睡覺太晚,看看身體器官的工作時間

不要睡覺太晚,看看身體器官的工作時間 晚上9 11點為免疫系統 淋巴 排毒時間,此段時間應安靜或聽 晚間11 凌晨1點,肝的排毒,需在熟睡中進行。凌晨1 3點,膽的排毒,亦同。凌晨3 5點,肺的排毒。此即為何咳嗽的人在這段時間咳得最劇烈,因排毒動作已走到肺 不應用止咳藥,以免抑制廢積物的排除。凌晨5...

熬夜的朋友注意了 看看器官的工作時間

我相信 很多朋友都和我一樣有熬夜的習慣 今偶在某bbs看到這則驚人訊息 特轉貼過來。熬夜的朋友 應該注意自己的健康了。有了健康就有一切 失去健康 就可能失去一切。以下是原文轉貼 不要睡覺太晚,看看身體器官的工作時間 晚上9 11點為免疫系統 淋巴 排毒時間,此段時間應安靜或聽音樂 晚間11 凌晨1點...