从字符串中删除多种格式的日期

时间:2015-11-25 16:22:02

标签: sql-server string tsql sql-server-2014

我有一列字符串,名为" MyStrings"如下:

...
Foo bar Jul15 blah blah.xlsx
Choo bar Jul-15 blah far.xlsx
Star bar 10-Jul-15 blah far.xlsx
Car Star bar 10.Jul.2015 blah far.xlsx
...
...

我想进行字符串操作,因此所有日期,无论格式如何,都不会包含在结果中。

以下查询:

SELECT  results = <manipulated "MyStrings">
FROM    aTable

应该有以下结果:

...
Foo bar  blah blah.xlsx
Choo bar  blah far.xlsx
Star bar  blah far.xlsx
Car Star bar  blah far.xlsx
...
...

是否有快速的方法可以执行此操作,还是需要单独考虑每种格式?

1 个答案:

答案 0 :(得分:1)

您需要Split function

如果先按<space>拆分,则可以轻松为

创建常规表达式
monDD
mon-DD
DD-mon-YY
DD-mon-YYYY

<强> SQL Fiddle Demo

WITH splitCTE AS (
  SELECT s.[id], f.Number, f.Item
  FROM dbo.SourceData AS s
  CROSS APPLY dbo.SplitStrings(s.[test], ' ') as f
)
  SELECT *,
         CASE
             WHEN item Like 'Jul[0-9][0-9]' THEN 'mmmdd'
             WHEN item Like 'Jul-[0-9][0-9]' THEN 'mmm-dd'
             WHEN item Like '[0-9][0-9]-Jul-[0-9][0-9]' THEN 'dd-mmm-yy'
             WHEN item Like '[0-9][0-9].Jul.[0-9][0-9][0-9][0-9]' THEN 'dd.mmm.yyyy'
             ELSE ''
         END matchType         
  FROM splitCTE

输出

  • 需要使用3个月的列表连接来替换有线Jul
  • 轻松扩展以包含具有完整月份名称的版本。
  • Jul77mmmdd匹配,但这是一个开始。
  • 您可以在另一个步骤中计算IsValidDate列
    • 对于某些格式,您可以使用CONVERT来检查有效日期
    • 对于像Jul77这样的其他人,您可以将前3个字符与最后2个字符分开并尝试获取日期。

| id | Number |        Item |   matchType |
|----|--------|-------------|-------------|
|  1 |      1 |         Foo |             |
|  1 |      2 |         bar |             |
|  1 |      3 |       Jul15 |       mmmdd |
|  1 |      4 |        blah |             |
|  1 |      5 |   blah.xlsx |             |
|  2 |      1 |        Choo |             |
|  2 |      2 |         bar |             |
|  2 |      3 |      Jul-15 |      mmm-dd |
|  2 |      4 |        blah |             |
|  2 |      5 |    far.xlsx |             |
|  3 |      1 |        Star |             |
|  3 |      2 |         bar |             |
|  3 |      3 |   10-Jul-15 |   dd-mmm-yy |
|  3 |      4 |        blah |             |
|  3 |      5 |    far.xlsx |             |
|  4 |      1 |         Car |             |
|  4 |      2 |        Star |             |
|  4 |      3 |         bar |             |
|  4 |      4 | 10.Jul.2015 | dd.mmm.yyyy |
|  4 |      5 |        blah |             |
|  4 |      6 |    far.xlsx |             |

然后使用您最喜欢的 XML PATH 加入,而不使用匹配的元素