Sql server SQL Server-以多种格式从字符串中提取日期

Sql server SQL Server-以多种格式从字符串中提取日期,sql-server,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

我继承了一个相当混乱的数据库表列,名为
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
我正在尝试确定是否有任何方法可以从这些字段中提取日期,这些字段有这么多不同的格式,而不必为本专栏中的每一个可能的变化使用类似正则表达式的模式

最终提取的数据如下所示:

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实现,使用某种“如果它看起来像一个日期,尝试提取它”的方法。如果不是开箱即用的话,也许可以使用助手扩展或插件?

这是可能的,但也有潜在的陷阱。这当然需要扩大和保持

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

示例-

返回


没有比这更强大的了。如果你的数据那么糟糕,你怎么知道1979年1月8日到底是哪一天?这是个好问题。我想我的方法是先解决这一部分,然后一旦解决了这一部分,我可以将有问题的部分(如你的示例)交叉引用到它们的源代码,以确定源代码的格式。一旦转换,你就不知道它是否有问题。
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