

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[f_dat_fechasemana]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[f_dat_fechasemana]
GO


create function [dbo].[f_dat_fechasemana](@p_fecha smalldatetime,@p_semana int ,@p_inicial bit ) returns smalldatetime
as 
begin
--declaro una variable de tipo fecha para devolver la fecha inicial de la semana o la fecha fin que pertenesca al numero de la semana del aņo
declare @fecha as smalldatetime
set @fecha = CONVERT ( smalldatetime , CAST( DAY ( @p_fecha) as varchar(10))+'/'+CAST( month ( @p_fecha)as varchar(10))+'/'+CAST( year(@p_fecha)as varchar(10)) ,103)


if (@p_inicial =1)-- pregunto que si la fehca de la semana que deseo obtener es la inicial o la final 
begin 
		while  (@fecha > 0 and @p_semana =DATEPART(ISO_WEEK,dateadd( dd,-1,@fecha)))
		begin
		set @fecha =dateadd( dd,-1,@fecha)-- descuento dias si es la inicial
		end 
end
else
begin
		while (@p_semana =DATEPART(ISO_WEEK,dateadd( dd,1,@fecha)))
		begin 
		set @fecha =dateadd( dd,1,@fecha)-- aumento dias si es la final
		end 
		-- dejo que la fecha fin tenga 23:59 para que tambien aplique en el filtro
        set @fecha = CONVERT ( smalldatetime , CAST( DAY ( @fecha ) as varchar(10))+'/'+CAST( month ( @fecha )as varchar(10))+'/'+CAST( year(@fecha )as varchar(10)) +' 23:59:00'   ,103)
end

return @fecha
end

GO


