Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come ottenere un elenco della data di inizio settimana (lunedì) e della data di fine (domenica) tra due date?

Questo funzionerà fintanto che gli intervalli sono 38 anni o meno. Offrirà prestazioni migliori e non si basa sull'impostazione locale del server.

Questa impostazione farà sì che lo script restituisca un risultato errato:

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

Ciò significa che la tua impostazione locale è attualmente in conflitto con le tue esigenze e il tuo codice sta compensando.

Ecco la sceneggiatura. Lo script è limitato a 38 anni per motivi di prestazioni (trovo improbabile che tu abbia bisogno di intervalli più grandi di quello). Sarà abbastanza facile estenderlo a più anni.

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)

Risultato:

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