Това ще работи, докато интервалите са 38 години или по-малко. Той ще предложи по-добра производителност и не разчита на локалната настройка на сървъра.
Тази настройка ще накара вашия скрипт да върне грешен резултат:
set datefirst 1
select * from dbo.fnGetWeeksBetweenDates('2014-03-21','2014-03-21')
Това означава, че вашата локална настройка в момента противоречи на вашите нужди и кодът ви компенсира.
Ето го сценария. Сценарият е ограничен до 38 години от съображения за ефективност (смятам, че е малко вероятно да имате нужда от по-големи интервали от това). Ще бъде доста лесно да го удължите за повече години.
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)
Резултат:
Start_Week End_Week
2014-03-17 2014-03-23
2014-03-24 2014-03-30