2017-07-19 31 views
0

我想總結特定日期條件之間的總工作時間。我已經找回了每天的工作時間。現在我想遍歷一個日期範圍並總結工作時間和分鐘。使用循環獲取多個hh24:mi值的總和

這裏是我正努力開發方法:

create or replace FUNCTION GET_Working_hrs_Total (ecd in number,start_dt in DATE,end_dt in date,stdin IN VARCHAR2,stdout in VARCHAR2) 
RETURN varchar2 AS 
-- 
hrs varchar2(1000); 
temp_date date; 
-- 
BEGIN 

temp_date :=start_dt; 

while temp_date <=end_dt 
LOOP 

select olphrm.get_std_hrs(ecd,temp_date,stdin,stdout)--It will return the working hours of date passed for example 8:30 i.e. 8 hours 30 minutes 
into hrs from dual;--I want to get the count of Total working hours in this variable 

temp_date :=temp_date+1;--switch to next day 
END LOOP; 

     return hrs;   

END; 

我如何能實現的總工作小時和分鐘的格式類似16:30即16小時30分鐘?

回答

0

嘗試:

create or replace FUNCTION GET_Working_hrs_Total (ecd in number,start_dt in DATE,end_dt in date,stdin IN VARCHAR2,stdout in VARCHAR2) 
RETURN varchar2 AS 
-- 
v_hours number(3,0) := 0; -- We'll put hours in here 
v_mins number(6,0) := 0; -- An mins in here 
hrs varchar2(1000); 
temp_date date; 
-- 
BEGIN 

temp_date :=start_dt; 

while temp_date <=end_dt 
LOOP 


select t-_number(to_char(olphrm.get_std_hrs(ecd,temp_date,stdin,stdout), 'HH24'), '999') + v_hours 
into v_hours 
from dual; -- Add new hours to old hours 



select to_number(to_char(olphrm.get_std_hrs(ecd,temp_date,stdin,stdout), 'MI'), '999') + v_mins into v_mins from dual; -- Add new mins to old mins 

temp_date :=temp_date+1; 

END LOOP; 

v_hours := v_hours + floor(v_mins/60); -- Add mins to hours 

v_mins := mod(v_mins, 60); -- and ditch the hours from mins 

hrs:= to_char(v_hours, '999') ||':'||to_char(v_mins,'99'); -- create the varchar to return 

     return hrs;   

END; 
+0

還好..讓我試試吧.. –

+0

它不工作,因爲char值不能被添加到數字值。 –

+0

@AlinaAnjum請參閱編輯,我在'to_char()'周圍添加了'to_number()'。這不是很好,但它應該工作 – JohnHC

1

後一些在@ JohnHc的回答變化:

下面的代碼爲我工作:

create or replace FUNCTION GET_Working_hrs_Total (ecd in number,start_dt in DATE,end_dt in date,stdin IN VARCHAR2,stdout in VARCHAR2) 
RETURN varchar2 AS 
-- 
v_hours number(3,0) := 0; -- We'll put hours in here 
v_mins number(6,0) := 0; -- An mins in here 
hrs varchar2(1000); 
temp_date date; 
-- 
BEGIN 

temp_date :=start_dt; 

while temp_date <=end_dt 
LOOP 

SELECT EXTRACT(hour FROM to_timestamp(olphrm.GET_Working_hrs(ecd,temp_date,stdin,stdout), 'hh24:mi')) + v_hours 
into v_hours from dual; -- Add new hours to old hours 


SELECT EXTRACT(MINUTE FROM to_timestamp(olphrm.GET_Working_hrs(ecd,temp_date,stdin,stdout), 'hh24:mi')) + v_mins 
into v_mins from dual;-- Add new mins to old mins 


temp_date :=temp_date+1; 

END LOOP; 

v_hours := v_hours + floor(v_mins/60); -- Add mins to hours 

v_mins := mod(v_mins, 60); -- and ditch the hours from mins 

hrs:= to_char(v_hours, '999') ||':'||to_char(v_mins,'99'); -- create the varchar to return 

     return hrs;   

END;