Sql server 在T-SQL中将蹩脚的文本日期字符串转换为实际日期时间的更好方法?

Sql server 在T-SQL中将蹩脚的文本日期字符串转换为实际日期时间的更好方法?,sql-server,Sql Server,我收到一个文本文件中的日期,格式如下,但需要将其转换为datetime2字段 15-JAN-18 04.19.52.597000000 PM 我希望使用比这更简单的东西。格式很明显,但我不能用它去datetime,只是从datetime开始 从技术上讲,我可以使用datetimefromparts,但接下来我必须在AM/PM上处理case语句,转换为int,将其填充回varchar,等等 有更好的办法吗 DECLARE @blah VARCHAR(50) = '15-JAN-18 04.19.

我收到一个文本文件中的日期,格式如下,但需要将其转换为datetime2字段

15-JAN-18 04.19.52.597000000 PM
我希望使用比这更简单的东西。格式很明显,但我不能用它去datetime,只是从datetime开始

从技术上讲,我可以使用datetimefromparts,但接下来我必须在AM/PM上处理case语句,转换为int,将其填充回varchar,等等

有更好的办法吗

DECLARE @blah VARCHAR(50) = '15-JAN-18 04.19.52.597000000 PM';
WITH cte AS
(
SELECT SUBSTRING(@blah,1,2) AS dd, SUBSTRING(@blah,4,3) AS mon, SUBSTRING(@blah,8,2) AS yy,
    SUBSTRING(@blah,11,2) AS hh, SUBSTRING(@blah,30,2) AS ampm, SUBSTRING(@blah,14,2) AS mm, SUBSTRING(@blah,17,2) AS ss, SUBSTRING(@blah, 20,9) AS ms, @blah AS raw
    )
SELECT CONVERT(DATETIME2,dd + '-' + mon + '-' + yy + ' ' + hh + ':' + mm + ':' + ss + '.' + ms + ' ' + ampm), raw
从cte来看,也许有一种方法

示例

Declare @S varchar(50)='15-JAN-18 04.19.52.597000000 PM'

Select try_convert(datetime2,replace(left(@S,18),'.',':')+right(@S,13))
返回

2018-01-15 16:19:52.5970000

这看起来相当健壮。你的确切意思是,有没有更好的办法?更简洁?您使用的是什么版本的SQL Server?这是适当的圆滑:)@M.Ali谢谢你的笑容:)我可能会把这个作为答案。我只是想确保没有一种方法可以反向使用格式。我已经被宠坏了,奇怪的是MySQL的一些功能@我很喜欢MySQL,但总的来说,我现在是一个SQL Server女孩。Format()将值转换为字符串。有一些很棒的功能,但在较大的集合上性能会受到影响。