SQL Server - извлекает даты из строк в нескольких форматах - PullRequest
0 голосов
/ 12 июля 2019

Я унаследовал довольно большой беспорядок столбца таблицы базы данных с именем DOB, типа nvarchar - вот лишь пример данных в этом столбце:

DOB: 1998-09-04US
Sex: M Race: White Year of Birth: 1950
12/31/00
January 5th, 1998
Date of Birth: 12/19/1938
AGE; 46
DOB: 11-24-1967
May 31, 1942, Split, Croatia
DOB:   12/28/1986
D.O.B.31-OCT-92
D.O.B.: January 8, 1973
31/07/1974 (44 years old)
Date Of Birth: 08/01/1979
78  (DOB: 12/09/1940)
1961 (56 years old)
12/31/1985 (PRIMARY)
DOB:      05/27/67
8-Jun-43
9/9/78
12/31/84 0:00
NA
Birth Year 2018
nacido el 29 de junio de 1959

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

Полученные извлеченные данные будут выглядеть так:

1998-09-04
1950
12/31/00
January 5th, 1998
12/19/1938
11-24-1967
May 31, 1942
12/28/1986
31-OCT-92
January 8, 1973
31/07/1974
08/01/1979
12/09/1940
1961
12/31/1985
05/27/67
8-Jun-43
9/9/78
12/31/84
NA
2018
29 de junio de 1959

Хотя это может быть полной несбыточной мечтой, мне было интересно, можно ли это сделать с помощью SQL, с каким-то «похоже на свидание, попытка его извлечь "методом.И если не из коробки, возможно, с расширением помощника или плагином?

1 Ответ

0 голосов
/ 12 июля 2019

Возможно, но есть потенциальные подводные камни.Это, безусловно, нужно будет расширять и поддерживать.

Это сопоставление с использованием грубой силы, при котором выбирается самый длинный шаблон сопоставления

Пример - См. Полную рабочую демонстрацию

Select ID
      ,DOB
      ,Found 
 From  (
        Select * 
              ,Found = substring(DOB,patindex(PatIdx,DOB),PatLen)
              ,RN    = Row_Number() over (Partition By ID Order by PatLen Desc)
         From  @YourTable A
         Left Join  (
                Select *
                      ,PatIdx = '%'+replace(replace(Pattern, 'A', '[A-Z]'), '0', '[0-9]') +'%'
                      ,PatLen = len(Pattern)
                 From  @FindPattern 
               ) B 
           on  patindex(PatIdx,DOB)>0
       ) A
 Where RN=1

Возвраты

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...