Найти даты в строке

PolterGuest
Дата: 11.06.2011 23:39:23
как в строке текста найти все даты в формате dd.MM.yyyy (например, 29.11.2010) ?
Zelius
Дата: 11.06.2011 23:56:02
PolterGuest,

Через регулярные выражения, RegExp
PolterGuest
Дата: 12.06.2011 00:01:30
В Delphi то понятно, а в стандартном T-SQL такое разве есть ( без подключения каких-либо библиотек )
Zelius
Дата: 12.06.2011 00:03:34
PolterGuest,

Сорри, не заметил что сервер....
aleks2
Дата: 12.06.2011 06:42:20
PolterGuest
как в строке текста найти все даты в формате dd.MM.yyyy (например, 29.11.2010) ?


1. Разделить строку на слова
CREATE function [dbo].[f_StrToTableEx](@str varchar(8000), @delimiter varchar(64)=',')
returns table as
return(
WITH str_nums ( n1, n2, Number ) 
AS 
( 
select  1-LEN(@delimiter) as n1, charindex(@delimiter, @str+@delimiter) as n2, 0 as Number  
UNION ALL 
select n2 as n1, charindex(@delimiter, @str+@delimiter, n2+LEN(@delimiter)) as n2, Number+1 as Number
from str_nums
WHERE n2<len(@str)
) 
SELECT SUBSTRING(@str, n1+LEN(@delimiter), n2-n1-1) as Value, Number, n1+1 as StartPosition FROM str_nums
)
2. Проанализировать слова на предмет "даты в формате dd.MM.yyyy" функцией ISDATE()
aleks2
Дата: 12.06.2011 07:10:20
Пардон. Вариант функции выше не приспособлен к пробелам как разделителям. Исправляемся
ALTER function [dbo].[f_StrToTableEx](@str varchar(8000), @delimiter varchar(64)=',')
returns table as
return(
WITH str_nums ( n1, n2, Number ) 
AS 
( 
select  1-DATALENGTH(@delimiter) as n1, charindex(@delimiter, @str+@delimiter) as n2, 0 as Number  
UNION ALL 
select n2 as n1, charindex(@delimiter, @str+@delimiter, n2+DATALENGTH(@delimiter)) as n2, Number+1 as Number
from str_nums
WHERE n2<DATALENGTH(@str)
) 
SELECT SUBSTRING(@str, n1+DATALENGTH(@delimiter), n2-n1-DATALENGTH(@delimiter)) as Value, Number, n1+DATALENGTH(@delimiter) as StartPosition FROM str_nums
)

Пример

declare @t table(s nvarchar(1024))

insert @t
select N'Сегодня 12.06.11 и через год 12.06.12 методы поиска даты dd.mm.yyyy в строке останутся неизменными.'
union all
select N'Хотя некоторые трудности поиска "12.06.11" возможны.'

select *
FROM @t T cross apply dbo.f_StrToTableEx(s, ' ')

set dateformat DMY

select *
FROM @t T cross apply dbo.f_StrToTableEx(s, ' ')
WHERE ISDATE(Value)=1
PolterGuest
Дата: 14.06.2011 08:05:11
aleks2,

большое спасибо!