如何将“工作日月日时间”转换为日期时间(YYYY-MM-DD)?
Posted
技术标签:
【中文标题】如何将“工作日月日时间”转换为日期时间(YYYY-MM-DD)?【英文标题】:How to convert "weekday month day time" to datetime (YYYY-MM-DD)? 【发布时间】:2021-10-19 07:23:31 【问题描述】:我有一列fecha
,格式为
Mon Feb 22 07:55:55 CET 2021
如何将其转换为 YYYY-MM-DD 等日期格式?我试过CAST
,CONVERT
...
而且我总是收到以下错误消息:
消息 241,第 16 级,状态 1,第 4 行 从字符串转换日期和/或时间时转换失败
【问题讨论】:
您的日期和时间会始终采用ddd MMM dd hh:mm:ss tz yyyy
的格式吗?
一天中的日期总是两位数吗?
是的,表格中的格式总是这样
【参考方案1】:
假设,正如我评论的那样,值是 always ddd MMM dd hh:mm:ss tz yyyy
你可以做一些混乱的字符串操作来将值转换为有效的日期和时间数据类型。然后,您可以在表示层中随意格式化日期,因为它是强类型的:
SELECT V.DateString,
TRY_CONVERT(datetime2(0),STUFF(STUFF(LEFT(STUFF(V.DateString,1,8,''),12),3,0,RIGHT(V.DateString,5)),3,0,SUBSTRING(V.DateString,4,4)),113) AS ConvertedDate
FROM (VALUES('Mon Feb 22 07:55:55 CET 2021'))V(DateString);
当然,这里真正的教训是不要将日期和时间值作为varchar
存储在您的数据库中。日期和时间数据类型的存在是有原因的;使用它们。
【讨论】:
这可以简化为TRY_CONVERT(datetime, SUBSTRING(@DateTtimeString,5,7) + SUBSTRING(@DateTtimeString,25,4) , 109)
,如果天数总是两位数。
取决于 OP 是否要保留时间,@DanGuzman。因为它在那里,我假设 OP 想要保留它。如果他们不想保留它,为什么要存储它?
但是,我建议使用 RIGHT
而不是 SUBSTRING
来获取年份 @DanGuzman ,因为某些时区不是 3 个字符,我们不知道该值来自哪里.例如,欧洲目前正在遵守 DST,因此同一时区的值可能将CEST
(中欧夏令时)作为今天的值。
太棒了!完美运行,是的,格式总是完全一样的(至少在这张表中......)。我确实需要时间。我以为我可以做这样的事情,但我希望可以进行一些更简单的转换。我会看看我是否可以用这个列作为日期类型来重新制作表格。无论如何,非常感谢!
哦,是的,我确实看到了一些 CEST @Larnu。我会注意使用RIGHT
【参考方案2】:
我认为没有标准函数可以处理您的源字符串,因此我会结合更简单的标准转换来获得该结果:
declare @Cadena varchar(50) = 'Mon Feb 22 07:55:55 CET 2021'
select substring(@Cadena, 25, 4) + '-' +
replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(substring(@Cadena, 5, 3), 'Jan', '01'), 'Feb', '02'), 'Mar', '03'), 'Apr', '04'), 'May', '05'), 'Jun', '06'), 'Jul', '07'), 'Aug', '08'), 'Sep', '09'), 'Oct', '10'), 'Nov', '11'), 'Dec', '12') + '-' +
substring(@Cadena, 9, 2)
如果您的字符串格式不总是完全相同,这将失败,在这种情况下需要更多代码。
【讨论】:
以上是关于如何将“工作日月日时间”转换为日期时间(YYYY-MM-DD)?的主要内容,如果未能解决你的问题,请参考以下文章
将 Access 2007 日期/时间转换为文本,将 mm/dd/yyyy 转换为 yyyy-mm-dd