Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como obter uma lista de data de início da semana (segunda-feira) e data de término (domingo) entre duas datas?


Isso funcionará enquanto os intervalos forem de 38 anos ou menos. Oferecerá melhor desempenho e não depende da configuração local do servidor.

Essa configuração fará com que seu script retorne um resultado errado:
set datefirst 1
select * from dbo.fnGetWeeksBetweenDates('2014-03-21','2014-03-21')

Isso significa que sua configuração local atualmente está em conflito com suas necessidades e seu código está compensando.

Aqui está o roteiro. O script é limitado a 38 anos por motivos de desempenho (acho improvável que você precise de intervalos maiores do que isso). Será bastante fácil estendê-lo para mais anos.
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