SQL Server:从描述列中提取日期

问题描述 投票:1回答:2

如何从描述列(nvarchar)中提取日期,如下所示:

'LICENCE SUSPENDED UNTIL DEC 17, 2016 - ABILITY IMPAIRED SUSPENSION NO 5176283'
'SUSPENDED FOR MEDICAL REASONS UNTIL JUNE 19, 2017'

目标是将该日期插入日期时间列。

我正在使用SQL Server v17

提前致谢 :)

编辑:在非结构化日期之前总是有一个'UNTIL'。

sql sql-server date extract nvarchar
2个回答
1
投票

假设nvarchar中只提到了一个日期,你需要提取并且在那个日期之前它总是“UNTIL”字,如你所说,你可以尝试PATINDEX和SUBSTRING方法,如下所示:

DECLARE @x nvarchar(MAX) = N'SUSPENDED FOR MEDICAL REASONS UNTIL JUNE 19, 2017'
SELECT CONVERT(Date, substring(@x, patindex('%UNTIL%', @x) + 6, patindex('%[12][0-9][0-9][0-9]%', @x)-2 - patindex('%UNTIL%', @x)), 120)

SET @x  ='LICENCE SUSPENDED UNTIL DEC 17, 2016 - ABILITY IMPAIRED SUSPENSION NO 5176283'
SELECT CONVERT(Date, substring(@x, patindex('%UNTIL%', @x) + 6, patindex('%[12][0-9][0-9][0-9]%', @x)-2 - patindex('%UNTIL%', @x)), 120)

1
投票

如果日期始终采用相同的格式并放在UNTIL之后:

WITH cte AS (
SELECT 'LICENCE SUSPENDED UNTIL DEC 17, 2016 - ABILITY IMPAIRED SUSPENSION NO 5176283' AS stringValue
UNION ALL SELECT 'SUSPENDED FOR MEDICAL REASONS UNTIL JUNE 19, 2017'
)

SELECT 
     CAST(SUBSTRING(stringValue, CHARINDEX('UNTIL', stringValue) + 5, CHARINDEX(', 20', cte.stringValue)-18)  AS DATE)
FROM cte

-- the output:

2016-12-17
2017-06-19

我使用了两个锚点:

  • 'UNTIL'进入解析日期的开始
  • ',20'来检测日期的结束

我看到一个潜在的问题 - 几个月以不同的格式陈述:DEC和JUNE ..我的片段仍然可以处理这个因为锚点,但它表明日期的字符串表示的格式不一样,因此额外的转换也许在较大的数据集上需要

© www.soinside.com 2019 - 2024. All rights reserved.