将一年中的一周与“溢出”进行比较
Posted
技术标签:
【中文标题】将一年中的一周与“溢出”进行比较【英文标题】:Comparing Week of Year with "overflow" 【发布时间】:2021-06-15 16:26:54 【问题描述】:所以我希望能够查看一年中的特定一周,并查看之前和之后 6 周的所有数据。
WHERE t1.weeknum >= week-6 AND t1.weeknum
所以如果周是 20,我想返回 14 到 26 之间的所有内容。
问题是周 >=47 和
我认为这类似于指南针航向。假设你在 350 度,然后右转 30 度。 350+30 = 20 度方位。
我正在使用 SQL Server Express
【问题讨论】:
这是在日期表中吗? 星期存储为 int,但如果需要我可以更改 您能发布一些示例数据吗?如果你也有一个 year 字段,那将是可以使用的东西 【参考方案1】: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
。
对于“来自”值添加52
,以便结果始终为非负数。这假定输入值始终在1
到52
的范围内。
添加或减去所需的偏移量 (6
)。
使用模数计算带有环绕的值。
添加 1
将结果移回从 1 开始的范围:1
到 52
。
【讨论】:
【参考方案2】:在 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
【讨论】:
以上是关于将一年中的一周与“溢出”进行比较的主要内容,如果未能解决你的问题,请参考以下文章
2017-2018-2 20179302《网络攻防》第十一周作业