我的表中有一列采用YYWW
格式。我需要转换这个YYWW
并得到星期一的日期。
例如:
Input YYWW: 1847
Expected Output: 2018-11-19 [Monday's date in 2018 Week 47]
提前感谢
我尝试了下面的,但不能正常工作
declare @value int = 1519
SELECT CONVERT(VARCHAR(10), DATEADD(YEAR, 2000 + @value / 100-1900, 7 * (@value % 100)-7), 105);
1851 -Expected 17-12-2018[Monday] Works fine for this year 2018
1752 -Expected 25-12-2017[Monday] but shows 24-12-2017 [Sunday]
1652 -Expected 26-12-2016 [Monday] but shows 24-12-2016 [Saturday]
1519 -Expected 04-05-2015 [Monday] but shows 07-05-2015 [Thursday]
试试这个:
DECLARE @t table(YYWW char(4))
INSERT @t values('1847'),('1752'),('1652'),('1519')
SELECT
CAST(DATEADD(wk,RIGHT(YYWW,2)+DATEDIFF(d,0,DATEADD(
d,-4,LEFT(YYWW,2)+'0101'))/7,0) as date)
FROM @t
结果:
2018-11-19
2017-12-25
2016-12-26
2015-05-04
编辑:
要获得请求的格式DD-MM-YYYY:
SELECT
CONVERT(CHAR(10),DATEADD(wk,RIGHT(YYWW,2)+DATEDIFF(d,0,DATEADD(
d,-4,LEFT(YYWW,2)+'0101'))/7,0),105)
FROM @t
我个人会使用日历表。然后你可以做一些类似的事情:
SELECT YT.YYWW,
CT.[date]
FROM YourTable YT
JOIN CalendarTable CT ON CT.[Year] = '20'+LEFT(YT.YYWW,2)
AND CT.WeekNo = RIGHT(YT.YYWW,2)
AND CT.DayOfWeek = 1; --Assumes Monday is day 1.
我认为你的计算可能会在2018年第47周休息,从2018-11-26开始,这是一个星期一。
在任何情况下,如果您不同意以上内容,只需从的周数中减去1即可
DECLARE @Date date
DECLARE @Year int = 2000 +18
declare @week int = 47
SET @Date = DATEADD(YEAR, @Year - 1900, 0)
SELECT dateadd(ww,@week-1,DATEADD(DAY, (@@DATEFIRST - DATEPART(WEEKDAY, @Date) + (8 - @@DATEFIRST) * 2) % 7, @Date))