Я взял решение elindeblom и изменил его - использование строк (даже при приведении к датам) заставляет меня нервничать по поводу различных форматов дат, используемых во всем мире. Это позволяет избежать этой проблемы.
Пока не запрашивается, я также включил время, поэтому неделя заканчивается за 1 секунду до полуночи:
DECLARE @WeekNum INT = 12,
@YearNum INT = 2014 ;
SELECT DATEADD(wk,
DATEDIFF(wk, 6,
CAST(RTRIM(@YearNum * 10000 + 1 * 100 + 1) AS DATETIME))
+ ( @WeekNum - 1 ), 6) AS [start_of_week],
DATEADD(second, -1,
DATEADD(day,
DATEDIFF(day, 0,
DATEADD(wk,
DATEDIFF(wk, 5,
CAST(RTRIM(@YearNum * 10000
+ 1 * 100 + 1) AS DATETIME))
+ ( @WeekNum + -1 ), 5)) + 1, 0)) AS [end_of_week] ;
Да, я знаю, что все еще кастую, но по номеру. Мне это кажется безопаснее.
В результате:
start_of_week end_of_week
----------------------- -----------------------
2014-03-16 00:00:00.000 2014-03-22 23:59:59.000