
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DuracionOT]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[DuracionOT]
GO
CREATE function [dbo].[DuracionOT](@p_id int) returns float
as 
begin


declare @table table(fechaini smalldatetime,fechafin smalldatetime )
declare @inicio smalldatetime
declare @fin smalldatetime
declare @temp smalldatetime
declare @temp1 smalldatetime
declare @siguiente smalldatetime
declare @duracion as float

insert into @table (fechaini ,fechafin)
select
 MIN(desde_fh)
 ,dateadd (mi ,round(sum(duracion)/COUNT(distinct id_usuario),2)*60.0,min(desde_fh)) 
  from ort_programacion 
where [id_documento.ot]=@p_id and id_tipoprogramacion=6 and active=1     
group by id_reporteTecnico ,[id_documento.ot];
select @inicio =MIN(fechaini),@fin =max(fechafin) from @table;
set @duracion=0.0
while @inicio<=@fin 
begin--inicio condicion de fecha

select @temp=fechafin from @table where fechaini =@inicio 
set @siguiente = (select top 1 fechafin  from @table where fechaini>@inicio and fechaini <@temp order by fechaini desc )
		if exists (select* from @table where fechaini>@inicio and fechaini <@temp ) and (@siguiente>@temp ) begin
			  	set @temp=@siguiente
				set @temp1 =(select top 1 fechaini  from @table where fechaini>@inicio and fechaini <@temp order by fechaini desc )
			    set @duracion =DATEDIFF (MI ,@inicio ,@temp)+@duracion 
			    set @inicio =@temp1;
				
		end
		else-- si no tiene hacer el calculo normal sobre el mismo registro
	    begin  
	        set @duracion =DATEDIFF (MI ,@inicio ,@temp)+@duracion ;
		    set @inicio  = (select top 1 fechaini  from @table where fechaini>@temp order by fechaini asc);
		end
		
if not exists(select top 1 fechaini  from @table where fechaini>@temp order by fechaini asc)
begin
set @inicio  = DATEADD (hh,1,@temp)
end	else
begin
 set @inicio  = (select top 1 fechaini  from @table where fechaini>@temp order by fechaini asc);
end
 end-- fin de condicion de fecha

return round (@duracion/60.0,2)

end


