从字符串中剥离多种格式的日期

Stripping out dates, of several formats, from strings

我有一列字符串,名为 "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
...
...

是否有快速的方法,或者我是否需要单独考虑每种格式?

你需要一个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
  • 轻松扩展以包含具有完整月份名称的版本。
  • 将匹配 Jul77 作为 mmmdd 但这是一个开始。
  • 您可以在另一个步骤中计算 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加入回来,没有匹配的元素