如何在SqlServer中基于day [Ex:给定YYWW中的星期一的日期]将YYWW转换为日期格式?

时间:2018-11-22 08:24:57

标签: sql-server date format

我的表格中有一个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]

3 个答案:

答案 0 :(得分:1)

尝试一下:

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

答案 1 :(得分:1)

我个人会使用calendar table。然后您可以执行以下操作:

.select_row{
    color: #43B149;
    font-weight: bolder !important;
    background: #e4e5e6 !important;
    box-shadow: 1px 0px 1px 0px #cad6ce !important;
    -moz-box-shadow:1px 0px 1px 0px #cad6ce !important;
    -webkit-box-shadow:1px 0px 1px 0px #cad6ce !important;
    transform: scale(1);
    -webkit-transform: scale(1);
    -moz-transform: scale(1);
    -ms-transform: scale(1);
    td{box-shadow: 0px 3px 0px 0px #cad6ce !important;
        -moz-box-shadow:0px 3px 0px 0px #cad6ce !important;
        -webkit-box-shadow:0px 3px 0px 0px #cad6ce !important;
        background: #e4e5e6 !important;
    }
}
.table-forecast{
    border-collapse: separate;
    border-spacing: 0px;
}

答案 2 :(得分:0)

我认为您的计算可能会在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))