Technical Article

UDF For Extracting Actual Time From Two DateTime

,

Hi guys,

       I have created a script of User-Defined-Function to extract the calulated time from two given datetime inputs. But you have to pass THREE parameters like :-
a)Start Datetime
b)End Datetime
c)To display the format either in HH:MM:SS or HH.MM , we 
  use 'T'(HH:MM:SS) OR 'N'(HH.MM).

  Please feel FREE to E-mail me at contactgsp2000@yahoo.com

Have a great time,

Thanks and Regards,

Gurtej Singh

----- First Step 

CREATE FUNCTION udf_total_time (@start_time datetime, @end_time datetime, @rtn_format_type char(1) )  
RETURNS char(20) AS   
BEGIN  

--------------------------------------------------------
-- Function Written By Gurtej Singh Pandher
-- Why This Function Required :--
-- Because i could not found any function in SQL Server 
-- Extract the actual time in (HH:MM:SS or HH.MM Format). 
---SQL Server Provide only function like 
---DATEDIFF which is not sufficiant.

---Suggestion :-
---Start DateTime and End DateTime Should not be Null.

RETURN (

case when @rtn_format_type='T' then ---- Then For Time Format (00:00:00)

case when @start_time is null then '  ' else ---- Check if Time is Null

----------------
case len(rtrim(ltrim(convert(char(2),((datediff(ss,@start_time,@end_time) / 60) / 60)) ))) 
when 2 then rtrim(ltrim(convert(char(2),((datediff(ss,@start_time,@end_time) / 60) / 60)) ))
else rtrim(ltrim('0'+convert(char(2),((datediff(ss,@start_time,@end_time) / 60) / 60)) ))
end +':'+

case len(rtrim(ltrim(convert(char(2),((datediff(ss,@start_time,@end_time) / 60) - (((datediff(ss,@start_time,@end_time) / 60) / 60) * 60) )) ))) 
when 2 then rtrim(ltrim(convert(char(2),((datediff(ss,@start_time,@end_time) / 60) - (((datediff(ss,@start_time,@end_time) / 60) / 60) * 60) )) ))
else rtrim(ltrim('0'+convert(char(2),((datediff(ss,@start_time,@end_time) / 60) - (((datediff(ss,@start_time,@end_time) / 60) / 60) * 60) )) ))
end+':'+

case len(rtrim(ltrim(convert(char(2),(datediff(ss,@start_time,@end_time) - ((( ((datediff(ss,@start_time,@end_time) / 60) / 60) * 60) * 60 ) + ( (((datediff(ss,@start_time,@end_time) / 60) - (((datediff(ss,@start_time,@end_time) / 60) / 60) * 60) )) * 60 ))))  )))
when 2 then rtrim(ltrim(convert(char(2),(datediff(ss,@start_time,@end_time) - ((( ((datediff(ss,@start_time,@end_time) / 60) / 60) * 60) * 60 ) + ( (((datediff(ss,@start_time,@end_time) / 60) - (((datediff(ss,@start_time,@end_time) / 60) / 60) * 60) )) * 60 )))) ))
else rtrim(ltrim('0'+convert(char(2),(datediff(ss,@start_time,@end_time) - ((( ((datediff(ss,@start_time,@end_time) / 60) / 60) * 60) * 60 ) + ( (((datediff(ss,@start_time,@end_time) / 60) - (((datediff(ss,@start_time,@end_time) / 60) / 60) * 60) )) * 60 )))) ))
end
----------------

end -- case for null value


else case when @rtn_format_type='N' then  ---- For Numeric Format (0.00)


case when @start_time is null then '0.00' else  ---- Check if Time is Null

-------------
case len(rtrim(ltrim(convert(char(2),((datediff(ss,@start_time,@end_time) / 60) / 60)) ))) 
when 2 then rtrim(ltrim(convert(char(2),((datediff(ss,@start_time,@end_time) / 60) / 60)) ))
else rtrim(ltrim('0'+convert(char(3),((datediff(ss,@start_time,@end_time) / 60) / 60)) ))
end +'.'+

case len(rtrim(ltrim(convert(char(2),((datediff(ss,@start_time,@end_time) / 60) - (((datediff(ss,@start_time,@end_time) / 60) / 60) * 60) )) ))) 
when 2 then rtrim(ltrim(convert(char(2),((datediff(ss,@start_time,@end_time) / 60) - (((datediff(ss,@start_time,@end_time) / 60) / 60) * 60) )) ))
else rtrim(ltrim('0'+convert(char(2),((datediff(ss,@start_time,@end_time) / 60) - (((datediff(ss,@start_time,@end_time) / 60) / 60) * 60) )) ))
end
----------------


end -- case for null value


end ---- End of Then For Time Format (00:00:00)
end ---- End of Then For Numeric Format (0.00)



)  

END  --- End OF First Tnen -- RETURN


GO


----- Second Step is Create SP 
----- Example Below :-

create procedure use_of_udf_total_time as 

set nocount on

---Here I am creating one example Stored Procedure
---for how we can use this function 

create table #temp (
srno int identity (1,1),
start_time datetime not null,
end_time datetime not null)

insert into #temp 
select getdate(),dateadd(hh,1,getdate())
union
select getdate(),dateadd(hh,2,getdate())
union
select getdate(),dateadd(hh,3,getdate())
union
select getdate(),dateadd(hh,4,getdate())
union
select getdate(),dateadd(hh,5,getdate())
union
select getdate(),dateadd(hh,6,getdate())
union
select getdate(),dateadd(hh,7,getdate())
union
select getdate(),dateadd(hh,8,getdate())
union
select getdate(),dateadd(hh,9,getdate())

--select *,dbo.udf_total_time(start_time,end_time,'N') as total_time from #temp


update #temp set end_time = dateadd(mi,10,end_time) where srno=1
update #temp set end_time = dateadd(mi,-10,end_time) where srno=2
update #temp set end_time = dateadd(mi,12,end_time) where srno=3
update #temp set end_time = dateadd(mi,33,end_time) where srno=4
update #temp set end_time = dateadd(mi,45,end_time) where srno=5
update #temp set end_time = dateadd(mi,-23,end_time) where srno=6
update #temp set end_time = dateadd(mi,16,end_time) where srno=7
update #temp set end_time = dateadd(mi,-11,end_time) where srno=8
update #temp set end_time = dateadd(mi,27,end_time) where srno=9


update #temp set end_time = dateadd(ss,12,end_time) where srno=1
update #temp set end_time = dateadd(ss,-11,end_time) where srno=2
update #temp set end_time = dateadd(ss,15,end_time) where srno=3
update #temp set end_time = dateadd(ss,34,end_time) where srno=4
update #temp set end_time = dateadd(ss,47,end_time) where srno=5
update #temp set end_time = dateadd(ss,-28,end_time) where srno=6
update #temp set end_time = dateadd(ss,17,end_time) where srno=7
update #temp set end_time = dateadd(ss,-19,end_time) where srno=8
update #temp set end_time = dateadd(ss,22,end_time) where srno=9


--- Here Three parameters you have to pass like 
----Start Time , End Time --- Both sould be DATETIME 
----Result Format 'T' Stands for Time Format 
----(HH:MM:SS), 'N' Stands for Numeric Format (HH.MM)

select *,dbo.udf_total_time(start_time,end_time,'N') as total_time_in_NUMERIC_FORMAT from #temp

select *,dbo.udf_total_time(start_time,end_time,'T') as total_time_in_TIME_FORMAT from #temp

go

--- Third Step (Last Step)

execute use_of_udf_total_time

Rate

You rated this post out of 5. Change rating

Share

Share

Rate

You rated this post out of 5. Change rating