繁体   English   中英

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

[英]SQL Server: Extract date from a description column

我如何从像这样的描述列(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”。

如果日期始终采用相同的格式,并放在“直到”之后:

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。.由于锚点,我的代码段仍然可以处理此问题,但这表明该日期的字符串表示形式不相同,因此需要进行额外的转换可能在较大的数据集上需要

假设您需要提取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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM