如何从类似以下内容的描述列(nvarchar)中提取日期:
'LICENCE SUSPENDED UNTIL DEC 17, 2016 - ABILITY IMPAIRED SUSPENSION NO 5176283'
'SUSPENDED FOR MEDICAL REASONS UNTIL JUNE 19, 2017'
目标是将该日期插入datetime列中。
我正在使用SQL Server v17
预先感谢:)
编辑:在非结构化日期之前总会有一个“ UNTIL”。
答案 0 :(得分: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
我使用了两个锚点:
我看到一个潜在的问题-月份以不同的格式表示: DEC和JUNE ..由于锚点,我的代码段仍然可以处理此问题,但这是一个迹象,表明日期的字符串表示形式不相同,因此可能需要对较大的数据集进行额外的转换
答案 1 :(得分: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)