SQL Server-从几种格式的字符串中提取日期

时间:2019-07-11 21:15:00

标签: sql-server

我已经继承了一个类型为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 :(得分:0)

有可能,但是存在潜在的陷阱。当然,这必须扩大和维护。

这是暴力模式匹配,其中选择了最长的匹配模式

示例-Link to Gif

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

返回

See Full Working Demo