Điều này sẽ hoạt động miễn là khoảng thời gian là 38 năm hoặc ít hơn. Nó sẽ cung cấp hiệu suất tốt hơn và nó không phụ thuộc vào cài đặt cục bộ của máy chủ.
Cài đặt này sẽ khiến tập lệnh của bạn trả về kết quả sai:
set datefirst 1
select * from dbo.fnGetWeeksBetweenDates('2014-03-21','2014-03-21')
Điều này có nghĩa là cài đặt cục bộ của bạn hiện xung đột với nhu cầu của bạn và mã của bạn đang bù đắp.
Đây là kịch bản. Kịch bản được giới hạn trong 38 năm vì lý do hiệu suất (tôi thấy rằng không chắc bạn cần những khoảng thời gian lớn hơn thế). Sẽ khá dễ dàng để kéo dài nó đến nhiều năm hơn.
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)
Kết quả:
Start_Week End_Week
2014-03-17 2014-03-23
2014-03-24 2014-03-30