Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment obtenir une liste de date de début de semaine (lundi) et de date de fin (dimanche) entre deux dates ?

Cela fonctionnera tant que les intervalles sont de 38 ans ou moins. Il offrira de meilleures performances et ne dépend pas du paramètre local du serveur.

Ce paramètre fera en sorte que votre script renvoie un résultat erroné :

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

Cela signifie que votre configuration locale est actuellement en conflit avec vos besoins et que votre code compense.

Voici le scénario. Le script est limité à 38 ans pour des raisons de performances (je trouve peu probable que vous ayez besoin d'intervalles plus grands que cela). Il sera assez facile de l'étendre à plusieurs années.

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)

Résultat :

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