Ini akan bekerja selama interval 38 tahun atau kurang. Ini akan menawarkan kinerja yang lebih baik dan tidak bergantung pada pengaturan lokal server.
Pengaturan ini akan menyebabkan skrip Anda mengembalikan hasil yang salah:
set datefirst 1
select * from dbo.fnGetWeeksBetweenDates('2014-03-21','2014-03-21')
Ini berarti setelan lokal Anda saat ini bertentangan dengan kebutuhan Anda dan kode Anda mengimbanginya.
Berikut adalah skrip. Skrip dibatasi hingga 38 tahun karena alasan kinerja (saya merasa tidak mungkin Anda memerlukan interval yang lebih besar dari itu). Akan cukup mudah untuk memperpanjangnya hingga beberapa tahun lagi.
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)
Hasil:
Start_Week End_Week
2014-03-17 2014-03-23
2014-03-24 2014-03-30