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



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

其中t1.weeknum>=第6周与t1.weeknum<第+6周

所以,如果一周是20,我想归还14到26之间的所有东西。

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

我认为这将类似于指南针的航向。假设你在350度处,向右转30度。350+30=20度轴承。

我正在使用SQL Server Express

模数运算符(%(似乎就是您想要的。由于您使用范围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
  • 对于";从";值加上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

最新更新