我已经搜索过,但尚未找到这个有用的小片段。
我想输入......
预期结果:2014-01-07
(1月7日)
获得完整的约会,任何人?
编辑:我的服务器是SQL 2008
完成的代码归功于所有!。
declare @year int = 2014
declare @weeknr int = 2
declare @daynroffset int = 2
SELECT
DATEADD(DAY,+ (@daynroffset-1),
DATEADD(DAY,-DATEPART(DW,CAST('1/1/' + cast(@year as varchar) AS Date))+2,DATEADD(WK,@weeknr- 1,CAST('1/1/' + cast(@year as varchar) AS Date)))
)
答案 0 :(得分:3)
2012+:
DATEADD(DAY,-DATEPART(DW,DATEFROMPARTS("YEAR",1,1))+1+"DAY OF WEEK",DATEADD(WK,"WEEK NUMBER"-1,DATEFROMPARTS(2014,1,1)))
2008+:
SELECT DATEADD(DAY,-DATEPART(DW,CAST(CONCAT('1/1/',"YEAR") AS Date))+1+"DAY OF WEEK",DATEADD(WK,"WEEK NUMBER"-1,CAST(CONCAT('1/1/',"YEAR") AS Date)))
只需在必要时替换值。
这适用于任何日期。
答案 1 :(得分:3)
其他答案(到目前为止)使用SQL Server默认机制来确定星期和星期几。在这种情况下,当前语言设置确定星期几(通过@@DATEFIRST
设置),DATEPART(wk
使用1月1日作为第1周中包含的固定日期。
要获得独立于语言设置的确定性答案,可以使用ISO 8601 week standard,它在星期一开始一周,第一周始终包含1月4日。
此代码根据ISO周确定日期:
declare @year int = 2016
declare @isoweek int = 22
declare @isoday int = 2
-- ISO-WEEK 1 always contains 4th Jan, so let's use this as a base
declare @date datetime = cast(cast(@year as varchar(4)) + '-01-04T12:00:00' as datetime)
-- Offset the wanted DayOfWeek versus our base date
-- We also set DATEFIRST temporarily because it affects DayOfWeek
-- ISO-Weeks always start on Monday
declare @datefirst int = @@DATEFIRST
SET DATEFIRST 1
declare @offset int = datepart(dw, @date) - 1
SET DATEFIRST @datefirst
-- Add given day and week to basedate
set @date = dateadd(day, @isoday - 1 - @offset, dateadd(wk, @isoweek - 1, @date))
print @date
答案 2 :(得分:1)
declare @year int = 2014
declare @week int = 2
declare @day int = 2
declare @date datetime = cast(cast(@year as varchar(20)) + '-01-01' as datetime)
declare @offset int = datepart(dw, @date) - 1
set @date = dateadd(day, @day - @offset, dateadd(ww, @week - 1, @date))
print @date
答案 3 :(得分:0)
这可能在年边界附近有问题,但它适用于给出的示例数据。您可能想要添加更多验证。我已将日期时间操作的每一步分解为一个新字段,因此您可以看到它正在构建
2008
DECLARE @Year INT = 2014
DECLARE @WeekNum INT = 2
DECLARE @WeekDay INT = 2
SELECT
BaseDate = CAST( @year AS VARCHAR(4) )
, RoundToWeekStart = DATEADD(WEEK, DATEDIFF(WEEK, 0, CAST( @year AS VARCHAR(4) )), 0) -- Will be a Monday
, AddWeeksToRoundedDate = DATEADD(WEEK, @WeekNum - 1, DATEADD(WEEK, DATEDIFF(WEEK, 0, CAST( @year AS VARCHAR(4) )), 0) )
, AddWeekDay = DATEADD( DAY, @WeekDay - 1, DATEADD(WEEK, @WeekNum - 1, DATEADD(WEEK, DATEDIFF(WEEK, 0, CAST( @year AS VARCHAR(4) )), 0) ) )
2012 +
DECLARE @Year INT = 2014
DECLARE @WeekNum INT = 2
DECLARE @WeekDay INT = 2
SELECT
BaseDate = DATEFROMPARTS(@Year, 1, 1)
, RoundToWeekStart = DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEFROMPARTS(@Year, 1, 1)), 0) -- Will be a Monday
, AddWeeksToRoundedDate = DATEADD(WEEK, @WeekNum - 1, DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEFROMPARTS(@Year, 1, 1)), 0) )
, AddWeekDay = DATEADD( DAY, @WeekDay - 1, DATEADD(WEEK, @WeekNum - 1, DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEFROMPARTS(@Year, 1, 1)), 0) ) )