これは、間隔が 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
プレ>