Hace poco realicé un procedimiento almacenado (para una aplicación que estaba desarrollando) que recibía como parámetros los días de la semana y un rango de fecha, como resultado me devolvía las o la fecha de los días que le pasaba como parámetro. Por ejemplo:
Rango de fechas: 12/06/2016 al 23/06/2016
Días: Lunes, Miércoles
Entonces el resultado sería todos las fecha de los días lunes y miércoles que se encuentran dentro del rango de fecha.
Resultado: 13/06/2016 - 15/06/2016 - 20/06/2016 - 22/06/2016
Para este ejemplo vamos a hacer uso de varias funciones por ejemplo DateDiff, DateAdd y DateName.
Procedimiento
- Obtener la cantidad de días que hay dentro del rango de fechas.
- Dentro del ciclo while iterar hasta que se cumpla la condición.
Ahora les comparto el query
create procedure Fecha_RangoFechas
@lunes varchar(20) = null,
@martes varchar(20) = null,
@miercoles varchar(20) = null,
@jueves varchar(20) = null,
@viernes varchar(20) = null,
@fecha_desde datetime,
@fecha_hasta datetime
as
begin
declare @cantdias int
,@i int
,@fecha datetime
,@dia varchar(20)
set @cantdias = datediff (day, @fecha_desde, @fecha_hasta)
set @i = 0
while @i <= @cantdias
begin
set @fecha = DATEADD(day, @i, @fecha_desde)
set @dia = DATENAME(WEEKDAY, @fecha)
if (@lunes is not null and @lunes = @dia )
select convert(varchar(20), @fecha, 103)
if (@martes is not null and @martes = @dia )
select convert(varchar(20), @fecha, 103)
if (@miercoles is not null and @miercoles = @dia )
select convert(varchar(20), @fecha, 103)
if (@jueves is not null and @jueves = @dia )
select convert(varchar(20), @fecha, 103)
if (@viernes is not null and @viernes = @dia )
select convert(varchar(20), @fecha, 103)
set @i = @i + 1
end
end
/*Ahora probemos*/
--[dbo].[Fecha_RangoFechas] 'Lunes', null, 'Miércoles', null, null, '12/06/2016', '23/06/2016'
--[dbo].[Fecha_RangoFechas] 'Lunes', 'Martes', 'Miércoles', null, null, '12/06/2016', '23/06/2016'