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

时间:2018-01-24 22:33:55

标签: sql-server

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

15-JAN-18 04.19.52.597000000 PM

我希望使用比这更容易的东西。格式显而易见,但我无法使用它来转发日期时间,仅限日期时间。

从技术上讲,我可以使用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

FROM cte

1 个答案:

答案 0 :(得分:2)

也许是一种方法

示例

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