domingo, 12 de junio de 2016

Listar fechas de un rango en Sql

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'

No hay comentarios:

Publicar un comentario