none
Obtener rango de fecha RRS feed

  • Pregunta

  • Buen dia, necesito realizar un sp para obtener todas las semanas entre 2 parametros de fechas (a partir de la fecha de inicio contara la semana, si es martes, hasta el proximo martes de la semana que entra sera la semana), Si antes de llegar al dia donde se cumple la semana que aumente otra semana.por ejemplo:

    Fecha inicio: 22/08/2017

    Fecha fin:22/09/2017 

    Esperando algo de resultado asi: 

    29/08/2017
    05/09/2017
    12/09/2017
    19/09/2017
    26/09/2017



    martes, 22 de agosto de 2017 13:10

Respuestas

  • Intenta obtener el rango de fechas mediante una CTE, por ejemplo:

    SET DATEFIRST 7;
    
    DECLARE @fInicio date = '20170822';
    DECLARE @fFin date = '20170922';
    
    WITH RangoFechas AS
    (
        SELECT DATEADD(DAY, 
    	   CASE WHEN DATEPART(WEEKDAY, @fInicio) = 3 THEN 7 ELSE 0 END, @fInicio) Fecha
        UNION ALL
        SELECT DATEADD(DAY, 7, Fecha) FROM RangoFechas WHERE Fecha < @fFin
    )
    SELECT * FROM RangoFechas;
    GO


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    martes, 22 de agosto de 2017 14:36

Todas las respuestas

  • Es necesario un sp pero puedes hacerlo con un ciclo repetitivo en el cliente ?

    Pasa los puntos prro v:

    martes, 22 de agosto de 2017 13:32
  • Para cada fecha en el rango pudieras calcular el proximo Martes (exclusivo).

    Hacerlo con una tabla Calendario o una tabla auxiliar de números seria menos engorroso.

    DECLARE
    	@sdt date = '20170822',
    	@edt date = '20170922';
    
    SELECT
    	T.prox_martes
    FROM
    	Calendario AS C
    	CROSS APPLY
        (
    	VALUES (CAST(DATEADD(DAY, DATEDIFF(DAY, '19000102', C.[Date]) / 7 * 7 + 7, '19000102') AS date))
    	) AS T(prox_martes)
    WHERE
    	C.[Date] BETWEEN @sdt AND @edt
    GROUP BY
    	T.prox_martes
    ORDER BY
    	T.prox_martes
    OPTION (RECOMPILE);
    GO


    Si no tienes la tabla calendario entonces usa esta funcion tipo tabla en linea que simula una tabla auxiliar de números.

    DECLARE
    	@sdt date = '20170822',
    	@edt date = '20170922';
    --Itzik's VATN
    WITH Calendar AS (
    SELECT
    	DATEADD(DAY, n - 1, @sdt) AS [Date]
    FROM
    	dbo.ufn_GetNums(DATEDIFF(DAY, @sdt, @edt) + 1)
    )
    SELECT
    	T.prox_martes
    FROM
    	Calendar AS C
    	CROSS APPLY
        (
    	VALUES (CAST(DATEADD(DAY, DATEDIFF(DAY, '19000102', C.[Date]) / 7 * 7 + 7, '19000102') AS date))
    	) AS T(prox_martes)
    WHERE
    	C.[Date] BETWEEN @sdt AND @edt
    GROUP BY
    	T.prox_martes
    OPTION (RECOMPILE);
    GO

    La idea para calcular el proximo Martes (exclusivo) es usando una fecha ancla que fue Martes (como 1900-01-02).  A partir de esta calcular cuantos rangos enteros de siete dias existen, multiplicarlos por 7 y adicionarles 7 dias para llegar al proximo martes.

    El calculo es exclusivo porque si una fecha es Martes entonces devuelve el proximo.



    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas




    martes, 22 de agosto de 2017 13:48
  • tengo un proble en dbo.ufn_GetNums.
    martes, 22 de agosto de 2017 14:26
  • Intenta obtener el rango de fechas mediante una CTE, por ejemplo:

    SET DATEFIRST 7;
    
    DECLARE @fInicio date = '20170822';
    DECLARE @fFin date = '20170922';
    
    WITH RangoFechas AS
    (
        SELECT DATEADD(DAY, 
    	   CASE WHEN DATEPART(WEEKDAY, @fInicio) = 3 THEN 7 ELSE 0 END, @fInicio) Fecha
        UNION ALL
        SELECT DATEADD(DAY, 7, Fecha) FROM RangoFechas WHERE Fecha < @fFin
    )
    SELECT * FROM RangoFechas;
    GO


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    martes, 22 de agosto de 2017 14:36