【问题标题】:How can I convert YYWW to date format based on day[Ex: Monday's date in given YYWW ] in SqlServer?如何将 YYWW 转换为基于 SqlServer 中的日期 [例如:给定 YYWW 中的星期一日期] 的日期格式?
【发布时间】:2019-04-24 21:10:51
【问题描述】:

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

【问题讨论】:

  • 到目前为止,您做了哪些尝试?第一个数字可以有的最低值是多少?例如应该假设 7021 是 1970 还是 2070?
  • 年份总是在 2000 到 2100 之间
  • 另外,你有日历表吗?根据您所在的位置/身份,一周的开始时间会有所不同。
  • 好的,我们还需要看看你的尝试。
  • 用我的试验编辑了帖子。请看一看。谢谢!

标签: sql-server date format


【解决方案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

【讨论】:

  • 非常感谢克劳森!
  • t-clausen.dk,一个问题,我需要使用任何代码将日期从 YYYY-MM-DD 格式化为 DD-MM-YYYY 吗?对于这种格式 DD-MM-YYYY,上述脚本需要进行哪些更改?
【解决方案2】:

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

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.

【讨论】:

  • 您在链接中引用的日历表使用星期日作为一周的第一天
  • @t-clausen.dk 日历表根据企业/用户的需要和偏好进行个性化;仅仅因为链接将星期日作为第 1 天,并不意味着 OP 的意愿。该链接只是一个模板。
【解决方案3】:

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

【讨论】:

  • 抱歉,我糟糕的第 47 周实际上是 2018-11-19,所以您需要从 @week 中减去 1 - 已编辑答案以反映
  • 这不会总是返回正确的结果。 @@DATEFIRST 不可靠,应避免使用。它取决于本地设置,并且可以在不同的计算机上给出不同的结果。通常您需要 SET DATEFIRST 才能使其工作。避免它更容易
  • @@DATEFIRST 会话不依赖于计算机,此外,代码通过使用 @@DATEFIRST 查找一年中的第一个星期一,适用于所有会话设置。
  • 您的代码没有为1519 提供正确的结果,正确的结果是2015-05-04,您的代码返回2015-05-11 是 - datefirst 取决于会话,但对于不同的服务器它有不同的默认值
  • 正确,我错误地认为一年中的第一周总是有星期一。
猜你喜欢
  • 2012-06-26
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
  • 2014-02-25
  • 2018-02-12
  • 2022-01-24
  • 2022-01-27
  • 2015-08-02
相关资源
最近更新 更多