从SQL中的文本中删除日期

Mar*_*rgP 2 sql sql-server date

我有一个类似下面的数据集,我想从中删除日期组件.一个挑战是日期可以采用不同的格式,如下所示.

现有产出

Event A 05-25-2015
Event B 25-05-2015
Event C April 2015
Event D 2016
Run Code Online (Sandbox Code Playgroud)

期望的输出

Event A
Event B
Event C
Event D 
Run Code Online (Sandbox Code Playgroud)

Tom*_*m H 7

一些让你入门的东西.根据您可能面临的格式数量,您可能希望将它们全部作为模式放入表中,连接到该表,并用于LEN计算STUFF命令的值.

DECLARE @test TABLE (my_string VARCHAR(50) NOT NULL)

INSERT INTO @test (my_string)
VALUES
    ('Event A 05-25-2015'),
    ('Event B 25-05-2015'),
    ('Event C April 2015'),
    ('Event D 2016')

SELECT
    CASE
        WHEN PATINDEX('%[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]%', my_string) > 0
            THEN STUFF(my_string, PATINDEX('%[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]%', my_string), 10, '')
        WHEN PATINDEX('%April [0-9][0-9][0-9][0-9]%', my_string) > 0
            THEN STUFF(my_string, PATINDEX('%April [0-9][0-9][0-9][0-9]%', my_string), 10, '')
        WHEN PATINDEX('%[0-9][0-9][0-9][0-9]%', my_string) > 0
            THEN STUFF(my_string, PATINDEX('%[0-9][0-9][0-9][0-9]%', my_string), 4, '')
        ELSE my_string
    END AS my_string
FROM
    @test
Run Code Online (Sandbox Code Playgroud)

我的猜测是,这非常容易出错,如果某人有一个名为"Event 6421"的事件,可能会发现误报.

这也只处理您的示例数据中的格式.我想你可能需要处理更多,但这应该指向正确的方向.