使用PATINDEX在SQL Server中使用多种格式在文本内查找时间

时间:2019-06-05 17:28:53

标签: sql sql-server sql-like patindex

我需要使用一个正则表达式,它返回格式为12:43和1:33的时间,我尝试了以下操作,每个都返回了所需的结果,如何将两者结合起来,以便SQL可以返回第一个OR第二个:

set @reg = '[0-9]:[0-5][0-9]'
set @reg = '[0-1][0-2]:[0-5][0-9]'

我尝试过的事情:

Declare @reg nvarchar(100) 
set @reg = '[0-9]:[0-5][0-9]' 
--set @reg = '[0-1][0-2]:[0-5][0-9]' 

select remarks, 
       substring(remarks,PATINDEX('%' + @reg + '%',remarks) ,5), len(PATINDEX('%' + @reg + '%',remarks)) 
from infraction 
where remarks like '%' + @reg + '%'

1 个答案:

答案 0 :(得分:3)

您将要查找任一模式存在的任何行,然后根据匹配的模式应用适当的SQL受限制的“ regex”。 HH:MMH:MM有更多限制,因此我们使用它来进行检查。

CREATE TABLE #infraction (
  Comment VARCHAR(100)
)

INSERT INTO #infraction VALUES ('time of 12:35 incident')
INSERT INTO #infraction VALUES ('time of 1:34 incident');

DECLARE @reg NVARCHAR(100) = '[0-9]:[0-5][0-9]'
DECLARE @reg2 NVARCHAR(100) = '[0-1][0-2]:[0-5][0-9]'

SELECT
    Comment,
    IIF(PATINDEX('%' + @reg2 + '%', Comment) = 0,
        SUBSTRING(Comment, PATINDEX('%' + @reg + '%', Comment), 4),
        SUBSTRING(Comment, PATINDEX('%' + @reg2 + '%', Comment), 5)
    )
FROM
    #infraction 
WHERE
    Comment LIKE '%' + @reg + '%'
    or
    Comment LIKE '%' + @reg2 + '%';

返回:

12:35
1:34

SQL Fiddle