我在SQL Server中有一个数据集,我需要转换其中一列。字符串(nvarchar(max))是年和星期的组合,因此2021年的第8周看起来像202108,2019年的第32周看起来像201932,依此类推。我需要的是将其转换为给定周的月份的最后一天,因此对于202302,我需要日期时间格式的01/31/2023。我尝试了一些不同的方法,如CAST(),但没有效果。
nvarchar(max)
202108
201932
202302
01/31/2023
CAST()
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
mzmfm0qo2#
日期时间格式再给后面的观众一次机会:日期时间值没有人类可读的格式。您看到的任何其他指示都是工具提供的便利。数据库级别的目标应该是返回一个基本的日期时间值,让客户端代码来处理格式问题,但我们可以做到这一点:
EOMonth(DATEADD(week, cast(right([MyColumn],2) as int),CONVERT(datetime, left([MyColumn], 4) + '0101')))
当然,这里的主键是the EOMonth() function,其他的都是字符串解析
EOMonth()
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
3条答案
按热度按时间lrpiutwd1#
也许这会有帮助,但这真的取决于你如何计算周数。也许日历表会是一个更好的选择。
mzmfm0qo2#
日期时间格式
再给后面的观众一次机会:日期时间值没有人类可读的格式。您看到的任何其他指示都是工具提供的便利。
数据库级别的目标应该是返回一个基本的日期时间值,让客户端代码来处理格式问题,但我们可以做到这一点:
当然,这里的主键是the
EOMonth()
function,其他的都是字符串解析ou6hu8tu3#
感谢John Cappelletti
查询
dbfiddle