sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo obtener una lista de la fecha de inicio de la semana (lunes) y la fecha de finalización (domingo) entre dos fechas?

Esto funcionará siempre que los intervalos sean de 38 años o menos. Ofrecerá un mejor rendimiento y no depende de la configuración local del servidor.

Esta configuración hará que su secuencia de comandos devuelva un resultado incorrecto:

set datefirst 1
select * from dbo.fnGetWeeksBetweenDates('2014-03-21','2014-03-21')

Esto significa que su configuración local actualmente entra en conflicto con sus necesidades y su código está compensando.

Aquí está el guión. El guión está limitado a 38 años por razones de rendimiento (me parece poco probable que necesite intervalos más grandes que ese). Será bastante fácil extenderlo a más años.

DECLARE @FromDate DATE = '2014-03-21'    
DECLARE @ToDate DATE  = '2014-03-24'    

SELECT @fromdate = dateadd(day, datediff(day, 0, @FromDate)/7*7, 0), 
@todate = dateadd(day, datediff(day, 0, @ToDate)/7*7, 6)

SELECT dateadd(d, number * 7, @fromdate) Start_Week, 
dateadd(d, number * 7 + 6, @fromdate) End_Week
FROM
master..spt_values
WHERE type = 'P' and
@todate >= dateadd(d, number * 7, @fromdate)

Resultado:

Start_Week  End_Week
2014-03-17  2014-03-23
2014-03-24  2014-03-30