将一年中的第几周与 "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 (%) 好像是你想要的。由于您使用范围 1
到 52
来表示周数,因此您需要在计算时将范围移动到 0
到 51
:
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
将其移动到从零开始的范围:0
到 51
。
- 对于“from”值添加
52
以便结果始终为非负数。这假设输入值始终在 1
到 52
. 范围内
- 添加或减去所需的偏移量 (
6
)。
- 使用模数计算带环绕的值。
- 添加
1
将结果移回以一为基础的范围:1
到 52
。
在 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
所以我希望能够查看一年中的特定一周,并查看前后 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 (%) 好像是你想要的。由于您使用范围 1
到 52
来表示周数,因此您需要在计算时将范围移动到 0
到 51
:
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
将其移动到从零开始的范围:0
到51
。 - 对于“from”值添加
52
以便结果始终为非负数。这假设输入值始终在1
到52
. 范围内
- 添加或减去所需的偏移量 (
6
)。 - 使用模数计算带环绕的值。
- 添加
1
将结果移回以一为基础的范围:1
到52
。
在 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