将一年中的第几周与 "overflow" 进行比较

Comparing Week of Year with "overflow"

所以我希望能够查看一年中的特定一周,并查看前后 6 周的所有数据。

WHERE t1.weeknum >= week-6 AND t1.weeknum <=week+6

所以如果周是 20,我想 return 14 到 26 之间的所有内容。

问题是周 >=47 且 <=6。例如,如果周为 4,我希望范围为 50 到 10。年是一个单独的维度,我包括所有数据,而不考虑年份。

我认为这类似于罗盘航向。假设您处于 350 度并向右转 30 度。 350+30 = 20度方位

我正在使用 SQL Server Express

Modulus operator (%) 好像是你想要的。由于您使用范围 152 来表示周数,因此您需要在计算时将范围移动到 051

select WeekNumber,
  ( WeekNumber - 1 + 52 - 6 ) % 52 + 1 as WeekFrom,
  ( WeekNumber - 1 + 6 ) % 52 + 1 as WeekTo
  from ( values ( 1 ), ( 4 ), ( 6 ), ( 20 ), ( 50 ), ( 52 ) ) as Samples( WeekNumber );

作为解释:

  • WeekNumber 开始。
  • 减去 1 将其移动到从零开始的范围:051
  • 对于“from”值添加 52 以便结果始终为非负数。这假设输入值始终在 152.
  • 范围内
  • 添加或减去所需的偏移量 (6)。
  • 使用模数计算带环绕的值。
  • 添加 1 将结果移回以一为基础的范围:152

在 WHERE 子句中使用 StartDate 和 EndDate。如果这是您所需要的,请标记为答案。

declare @StartDayOfYear int
, @EndDayOfYear int
, @WeekNo int
, @YearNo int
, @WeekDate date
, @YearText varchar(4)
, @Start int
, @WeekOfStart date
, @WeekOfEnd date

set @WeekNo = 2
set @YearNo = year(getdate())
set @YearText = @YearNo
set @WeekDate = (select dateadd(day,1 - datepart(dw, @YearText + '-01-01') + (@WeekNo-1) * 7,@YearText + '-01-01'))
set @Start = (select datepart(dayofyear,@WeekDate))
set @StartDayOfYear = (select @Start - 42)
set @EndDayOfYear = (select @Start + 42)
set @WeekOfStart = (select Convert (date,dateadd (day, @StartDayOfYear, @WeekDate)))
set @WeekOfEnd = (select Convert (date,dateadd (day, @EndDayOfYear, @WeekDate)))

select @StartDayOfYear
, @EndDayOfYear
, @WeekDate as StartWeek
, CAST(DATEADD(wk, 0, DATEADD(DAY, 1-DATEPART(WEEKDAY, @WeekOfStart), DATEDIFF(dd, -1, @WeekOfStart))) AS DATE) as StartDate
, CAST(DATEADD(wk, 1, DATEADD(DAY, 0-DATEPART(WEEKDAY, @WeekOfEnd), DATEDIFF(dd, 0, @WeekOfEnd))) AS DATE) as EndDate