Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie erhalte ich eine Liste mit Wochenstartdatum (Montag) und Enddatum (Sonntag) zwischen zwei Daten?

Dies funktioniert, solange die Intervalle 38 Jahre oder weniger betragen. Es bietet eine bessere Leistung und ist nicht auf die lokale Einstellung des Servers angewiesen.

Diese Einstellung führt dazu, dass Ihr Skript ein falsches Ergebnis zurückgibt:

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

Dies bedeutet, dass Ihre lokale Einstellung derzeit mit Ihren Anforderungen in Konflikt steht und Ihr Code dies kompensiert.

Hier ist das Skript. Das Skript ist aus Leistungsgründen auf 38 Jahre begrenzt (ich halte es für unwahrscheinlich, dass Sie größere Intervalle benötigen). Es wird ziemlich einfach sein, es auf weitere Jahre zu verlängern.

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)

Ergebnis:

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