Dates that match the pattern 2 numbers a single space the month a single space then a 4 digit year this will be good for any dates following this format from 1000 AD to 9999AD with a NVARCHAR(MAX) field note it will only pick up the last date in a text field.
Sourced adapted and tested from Stack Overflow
*Please note the square brackets c square brackets string is being omitted for months containing the letter c (I believe it relates to html and the copyright symbol I can’t place it anywhere in my post). You will need to add it back in to those months that contain c. I have therefore replaced square brackets c square brackets with [k]
January
Create function [dbo].[m01returnjandates](@fieldtosearch as nvarchar(max))
Returns nvarchar(15)
as
begin
declare @length as int
declare @loop as int
declare @retjandate as date
set @loop =1
set @length = len(@fieldtosearch)
while @loop<=@length-14
begin
if exists(select 1 where substring(@fieldtosearch,@loop,15) like '[0-9][0-9][ ][J][a][n][u][a][r][y][ ][0-9][0-9][0-9][0-9]')
set @retjandate= substring(@fieldtosearch,@loop,15)
set @loop=@loop+1
end
Return @retjandate
End
===
February
Create function [dbo].[m02returnfebdates](@fieldtosearch as nvarchar(max))
Returns nvarchar(16)
as
begin
declare @length as int
declare @loop as int
declare @retfebdate as date
set @loop =1
set @length = len(@fieldtosearch)
while @loop<=@length-15
begin
if exists(select 1 where substring(@fieldtosearch,@loop,16) like '[0-9][0-9][ ][F][e][b][r][u][a][r][y][ ][0-9][0-9][0-9][0-9]')
set @retfebdate= substring(@fieldtosearch,@loop,16)
set @loop=@loop+1
end
Return @retfebdate
End
====
March
Create function [dbo].[m03returnmardates](@fieldtosearch as nvarchar(max))
Returns nvarchar(13)
as
begin
declare @length as int
declare @loop as int
declare @retmardate as date
set @loop =1
set @length = len(@fieldtosearch)
while @loop<=@length-12
begin
if exists(select 1 where substring(@fieldtosearch,@loop,13) like '[0-9][0-9][ ][M][a][r][k][h][ ][0-9][0-9][0-9][0-9]')
set @retmardate= substring(@fieldtosearch,@loop,13)
set @loop=@loop+1
end
Return @retmardate
End
===
April
Create function [dbo].[m04returnaprdates](@fieldtosearch as nvarchar(max))
Returns nvarchar(13)
as
begin
declare @length as int
declare @loop as int
declare @retaprdate as date
set @loop =1
set @length = len(@fieldtosearch)
while @loop<=@length-12
begin
if exists(select 1 where substring(@fieldtosearch,@loop,13) like '[0-9][0-9][ ][A][p][r][i][l][ ][0-9][0-9][0-9][0-9]')
set @retaprdate= substring(@fieldtosearch,@loop,13)
set @loop=@loop+1
end
Return @retaprdate
End
===
May
Create function [dbo].[m05returnmaydates](@fieldtosearch as nvarchar(max))
Returns nvarchar(11)
as
begin
declare @length as int
declare @loop as int
declare @retmaydate as date
set @loop =1
set @length = len(@fieldtosearch)
while @loop<=@length-10
begin
if exists(select 1 where substring(@fieldtosearch,@loop,11) like '[0-9][0-9][ ][M][a][y][ ][0-9][0-9][0-9][0-9]')
set @retmaydate= substring(@fieldtosearch,@loop,11)
set @loop=@loop+1
end
Return @retmaydate
End
===
June
Create function [dbo].[m06returnjundates](@fieldtosearch as nvarchar(max))
Returns nvarchar(12)
as
begin
declare @length as int
declare @loop as int
declare @retjundate as date
set @loop =1
set @length = len(@fieldtosearch)
while @loop<=@length-11
begin
if exists(select 1 where substring(@fieldtosearch,@loop,12) like '[0-9][0-9][ ][J][u][n][e][ ][0-9][0-9][0-9][0-9]')
set @retjundate= substring(@fieldtosearch,@loop,12)
set @loop=@loop+1
end
Return @retjundate
End
===
July
Create function [dbo].[m07returnjuldates](@fieldtosearch as nvarchar(max))
Returns nvarchar(12)
as
begin
declare @length as int
declare @loop as int
declare @retjuldate as date
set @loop =1
set @length = len(@fieldtosearch)
while @loop<=@length-11
begin
if exists(select 1 where substring(@fieldtosearch,@loop,12) like '[0-9][0-9][ ][J][u][l][y][ ][0-9][0-9][0-9][0-9]')
set @retjuldate= substring(@fieldtosearch,@loop,12)
set @loop=@loop+1
end
Return @retjuldate
End
===
August
Create function [dbo].[m08returnaugdates](@fieldtosearch as nvarchar(max))
Returns nvarchar(14)
as
begin
declare @length as int
declare @loop as int
declare @retaugdate as date
set @loop =1
set @length = len(@fieldtosearch)
while @loop<=@length-13
begin
if exists(select 1 where substring(@fieldtosearch,@loop,14) like '[0-9][0-9][ ][A][u][g][u][s][t][ ][0-9][0-9][0-9][0-9]')
set @retaugdate= substring(@fieldtosearch,@loop,14)
set @loop=@loop+1
end
Return @retaugdate
End
===
September
Create function [dbo].[m09returnsepdates](@fieldtosearch as nvarchar(max))
Returns nvarchar(17)
as
begin
declare @length as int
declare @loop as int
declare @retsepdate as date
set @loop =1
set @length = len(@fieldtosearch)
while @loop<=@length-16
begin
if exists(select 1 where substring(@fieldtosearch,@loop,17) like '[0-9][0-9][ ][S][e][p][t][e][m][b][e][r][ ][0-9][0-9][0-9][0-9]')
set @retsepdate= substring(@fieldtosearch,@loop,17)
set @loop=@loop+1
end
Return @retsepdate
End
===
October
Create function [dbo].[m10returnoctdates](@fieldtosearch as nvarchar(max))
Returns nvarchar(15)
as
begin
declare @length as int
declare @loop as int
declare @retjoctdate as date
set @loop =1
set @length = len(@fieldtosearch)
while @loop<=@length-14
begin
if exists(select 1 where substring(@fieldtosearch,@loop,15) like '[0-9][0-9][ ][O][k][t][o][b][e][r][ ][0-9][0-9][0-9][0-9]')
set @retoctdate= substring(@fieldtosearch,@loop,15)
set @loop=@loop+1
end
Return @retoctdate
End
===
November
Create function [dbo].[m11returnnovdates](@fieldtosearch as nvarchar(max))
Returns nvarchar(16)
as
begin
declare @length as int
declare @loop as int
declare @retnovdate as date
set @loop =1
set @length = len(@fieldtosearch)
while @loop<=@length-15
begin
if exists(select 1 where substring(@fieldtosearch,@loop,16) like '[0-9][0-9][ ][N][o][v][e][m][b][e][r][ ][0-9][0-9][0-9][0-9]')
set @retnovdate= substring(@fieldtosearch,@loop,16)
set @loop=@loop+1
end
Return @retnovdate
End
===
December
Create function [dbo].[m12returndecdates](@fieldtosearch as nvarchar(max))
Returns nvarchar(16)
as
begin
declare @length as int
declare @loop as int
declare @retdecdate as date
set @loop =1
set @length = len(@fieldtosearch)
while @loop<=@length-15
begin
if exists(select 1 where substring(@fieldtosearch,@loop,16) like '[0-9][0-9][ ][D][e][k][e][m][b][e][r][ ][0-9][0-9][0-9][0-9]')
set @retdecdate= substring(@fieldtosearch,@loop,16)
set @loop=@loop+1
end
Return @retdecdate
End
===
And the inefficent example TSQL
SELECT dbo.T032email.pkid,
ISNULL(dbo.m01returnjandates(dbo.T032email.body),
ISNULL(dbo.m02returnfebdates(dbo.T032email.body),
ISNULL(dbo.m03returnmardates(dbo.T032email.body),
ISNull(dbo.m04returnaprdates(dbo.T032email.body),
ISNULL(dbo.m05returnmaydates(dbo.T032email.body),
ISNULL(dbo.m06returnjundates(dbo.T032email.body),
ISNULL(dbo.m07returnjuldates(dbo.T032email.body),
ISNull(dbo.m08returnaugdates(dbo.T032email.body,
ISNULL(dbo.m09returnsepdates(dbo.T032email.body),
ISNULL(dbo.m10returnoctdates(dbo.T032email.body),
ISNULL(dbo.m11returnnovdates(dbo.T032email.body), dbo.m12returndecdates(dbo.T032email.body)
))))))))))) as trandate FROM T032email;