如何在 SqlServer 中根据日期将 YYWW 转换为日期格式[例如:给定 YYWW 中的星期一日期]?



我的表中有一列采用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))

最新更新