SQL Server 将特定字符串转换为月份的最后一天

n3ipq98p  于 2023-01-16  发布在  其他
关注(0)|答案(3)|浏览(139)

我在SQL Server中有一个数据集,我需要转换其中一列。
字符串(nvarchar(max))是年和星期的组合,因此2021年的第8周看起来像202108,2019年的第32周看起来像201932,依此类推。
我需要的是将其转换为给定周的月份的最后一天,因此对于202302,我需要日期时间格式的01/31/2023。我尝试了一些不同的方法,如CAST(),但没有效果。

lrpiutwd

lrpiutwd1#

也许这会有帮助,但这真的取决于你如何计算周数。也许日历表会是一个更好的选择。

Declare @YourTable Table ([SomeCol] varchar(50))  Insert Into @YourTable Values 
 (202108)
,(201932)
,(202302)
 
Select * 
      ,NewVal = EOMonth(dateadd(week,try_convert(int,right(SomeCol,2)),convert(date,left(SomeCol,4)+'0101')))
 from @YourTable
    • 结果**
SomeCol NewVal
202108  2021-02-28
201932  2019-08-31
202302  2023-01-31
mzmfm0qo

mzmfm0qo2#

日期时间格式
再给后面的观众一次机会:日期时间值没有人类可读的格式。您看到的任何其他指示都是工具提供的便利。
数据库级别的目标应该是返回一个基本的日期时间值,让客户端代码来处理格式问题,但我们可以做到这一点:

EOMonth(DATEADD(week, cast(right([MyColumn],2) as int),CONVERT(datetime, left([MyColumn], 4) + '0101')))

当然,这里的主键是the EOMonth() function,其他的都是字符串解析

ou6hu8tu

ou6hu8tu3#

感谢John Cappelletti

Declare @YourTable Table ([SomeCol] varchar(50));
Insert Into @YourTable
([SomeCol]) Values 
 ('202108')
,('201932')
,('202302');

查询

SELECT 
DATEADD(wk,cast(right([SomeCol],2) as int),DATEADD(yy,cast((left([SomeCol],4)) as int)-1900,0))-1 AS WeekEnd
from  @YourTable

dbfiddle

相关问题