将非结构化字符串转换为特定格式

时间:2019-08-07 09:26:51

标签: sql sql-server tsql

我将以下字符串转换为以下指定格式。

给出字符串:

2019-07-06 8/7/2019 1:00:00 PMto2019-07-07 8/7/2019 4:00:00 AM
2019-07-06 8/7/2019 4:01:00 AMto2019-07-06 8/7/2019 10:00:00 PM
2019-07-06 1:00:00to2019-07-06 8/7/2019 4:00:00 AM
2019-07-06 8/7/2019 4:01:00 AMto2019-07-06 10:00:00 PM

对于上述给定的字符串,我想转换为以下格式:

预期结果:

2019-07-06 13:00:00to2019-07-06 4:00:00
2019-07-06 4:01:00to2019-07-06 22:00:00 
2019-07-06 1:00:00to2019-07-06 4:00:00
2019-07-06 4:01:00to2019-07-06 22:00:00

我的尝试:

DECLARE @D1 VARCHAR(MAX) = '2019-07-06 8/7/2019 4:01:00 AMto2019-07-07 8/7/2019 10:00:00 PM'

SELECT CASE WHEN LEN(SUBSTRING(@D1,CHARINDEX(' ',@D1)+1,CHARINDEX('M',@D1)-CHARINDEX(' ',@D1))) >= 19
       THEN REPLACE(@D1,SUBSTRING(@D1,CHARINDEX(' ',@D1)+1,CHARINDEX('t',@D1)-CHARINDEX(' ',@D1)-1),CAST(SUBSTRING(@D1,CHARINDEX(' ',@D1)+1,CHARINDEX('t',@D1)-CHARINDEX(' ',@D1)-1) AS TIME(0)))
       ELSE @D1
       END DateTime_result

无法在2019年8月7日第二次出现该问题。

2 个答案:

答案 0 :(得分:0)

尝试以下脚本。

DECLARE @D VARCHAR(MAX) = '2019-07-06 8/7/2019 1:00:00 PMto2019-07-07 8/7/2019 4:00:00 AM'

select cast(CONVERT(DATETIME2,(replace(substring(@D,1,CHARINDEX('to',@D,1)-1),' 8/7/2019 ',' ')), 0) as varchar(22)) + ' to ' + cast(CONVERT(DATETIME2,(replace(substring(@D,CHARINDEX('to',@D,1)+2,len(@D)),' 8/7/2019 ',' ')), 0) as varchar(22))

答案 1 :(得分:0)

DECLARE @D VARCHAR(MAX) = '2019-07-06 8/7/2019 1:00:00 PMto2019-07-07 8/7/2019 4:00:00 AM'

select replace(@d,substring(@d,charindex('/',@D)-1,charindex('/',@D)-4),'')