Detta kommer att fungera så länge som intervallen är 38 år eller mindre. Det kommer att erbjuda bättre prestanda och det är inte beroende av serverns lokala inställning.
Den här inställningen gör att ditt skript returnerar fel resultat:
set datefirst 1
select * from dbo.fnGetWeeksBetweenDates('2014-03-21','2014-03-21')
Detta innebär att din lokala inställning för närvarande står i konflikt med dina behov och att din kod kompenserar.
Här är manuset. Skriptet är begränsat till 38 år av prestandaskäl (jag finner det osannolikt att du behöver större intervall än så). Det kommer att vara ganska enkelt att förlänga det till fler år.
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)
Resultat:
Start_Week End_Week
2014-03-17 2014-03-23
2014-03-24 2014-03-30