可以这样计算:
declare @weeks table (week1 int, week2 int)
declare @today date = getdate()
select @@DATEFIRST
insert into @weeks(week1, week2)
values (12, 15)
;with computed_calendar as
(
select
@today today,
datepart(week, @today) as current_week,
datepart(weekday, @today) as current_weekday,
w.week1,
dateadd(week, w.week1-datepart(week, @today), @today) as week1_some_date,
dateadd(day, 1-datepart(weekday, @today), dateadd(week, w.week1-datepart(week, @today), @today)) as week1_start,
w.week2,
dateadd(week, w.week2-datepart(week, @today), @today) as week2_some_date,
dateadd(day, -datepart(weekday, @today), dateadd(week, w.week2+1-datepart(week, @today), @today)) as week2_end
from @weeks w
)
select
cc.today, cc.current_week, cc.current_weekday,
cc.week1_start,
datepart(week, cc.week1_start) week_1,
datename(weekday, cc.week1_start) week1_weekday,
cc.week2_end,
datepart(week, cc.week2_end) week_2,
datename(weekday, cc.week2_end) week2_weekday
from computed_calendar cc
在最后选择周和工作日计算以确保一切正常。您可以尝试将 DATEFIRST 移动到星期一或星期日,并检查脚本是否返回正确的结果。
您也可以提取当前日期的年数并将周数添加到 1 月 1 日。
我的方法演示了如何将周差添加到当前日期并从当前日期删除“额外”工作日以获得所需的工作日。
您要测试的时间段在week1_start 和week2_end 之间。
另一种测试周期的方法
您知道周数,并且您确切地知道范围界限总是从第 1 周的开始和第 2 周的结束,所以
只需检查您要测试的日期的周数是否在给定的周数内
select
...
where datepart(week, my_date) between week1 and week2
注意,如果年份不同,它可能会失败。虽然最初的周数并不能说明它们属于哪一年。