Będzie to działać tak długo, jak odstępy wynoszą 38 lat lub mniej. Zapewni lepszą wydajność i nie będzie opierać się na lokalnych ustawieniach serwera.
To ustawienie spowoduje, że skrypt zwróci nieprawidłowy wynik:
set datefirst 1
select * from dbo.fnGetWeeksBetweenDates('2014-03-21','2014-03-21')
Oznacza to, że Twoje ustawienia lokalne są obecnie w konflikcie z Twoimi potrzebami, a Twój kod się kompensuje.
Oto scenariusz. Scenariusz jest ograniczony do 38 lat ze względu na wydajność (nie wydaje mi się, żebyś potrzebował większych interwałów). Wydłużenie go na kolejne lata będzie dość łatwe.
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)
Wynik:
Start_Week End_Week
2014-03-17 2014-03-23
2014-03-24 2014-03-30