SQL Server: извлечение даты из столбца описания - PullRequest
1 голос
/ 15 марта 2019

как мне извлечь даты из столбца описания (nvarchar), как эти:

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

Цель состоит в том, чтобы вставить эту дату в столбец datetime.

Я использую SQL Server v17

Заранее спасибо:)

edit: перед неструктурированной датой всегда есть «UNTIL».

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Предполагая, что в 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 голос
/ 15 марта 2019

Если даты всегда в одном и том же формате и помещаются после 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

Я использовал два якоря:

  • «ДО», чтобы попасть в начало даты для разбора
  • ', 20' для определения конца даты

Я вижу потенциальную проблему - месяцы указаны в разных форматах: DEC и JUNE. Мой фрагмент все еще может справиться с этим из-за якорей, но это признак того, что формат представления строки даты не совпадает, поэтому, возможно, требуются дополнительные преобразования для большого набора данных

...