从SQL

时间:2016-03-01 21:45:46

标签: sql sql-server date

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

现有输出

Event A 05-25-2015
Event B 25-05-2015
Event C April 2015
Event D 2016

所需输出

Event A
Event B
Event C
Event D 

3 个答案:

答案 0 :(得分: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

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

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

答案 1 :(得分:0)

这里使用CROSS APPLY的另一种方法应该处理任何格式的数据。

这将考虑您的数据中两个空格,并提取第二个空格之前的数据。

CREATE TABLE #strings
  (
     col VARCHAR(50)
  )

INSERT INTO #strings
VALUES      ('Event A 05-25-2015'),
            ('Event B 25-05-2015'),
            ('Event C April 2015'),
            ('Event D 2016'),
            ('Event 4736765 2016')


SELECT Extracted_string = LEFT(col, pos2 - 1)
FROM   #strings
       CROSS apply (VALUES (Charindex(' ', col)))a(pos1)
       CROSS apply (VALUES(Charindex(' ', col, pos1 + 1)))b(pos2) 

<强>结果:

Extracted_string
----------------
Event A
Event B
Event C
Event D
Event 4736765

答案 2 :(得分:-2)

您是否拥有更新数据集的控件?如果是这样,请更新数据集并分隔两列。如果没有,请使用子字符串来删除事件名称。