【问题标题】:Stripping out dates, of several formats, from strings从字符串中去除多种格式的日期
【发布时间】:2015-11-26 01:29:55
【问题描述】:

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

有没有一种快速的方法,还是我需要单独考虑每种格式?

【问题讨论】:

  • 在你的例子中,月份总是3个字符,所以也许你可以使用它。搜索“单词”(由空格分隔的单位),包含 3 个字母和(一些?)数字。
  • 不要以为你会找到一个简单的解决方案,有多种格式。
  • @Tanner ye 的小信仰...我仍然充满希望
  • LOL 悲观主义者和乐观主义者之间的区别?经验。 :) 仅从您发布的非常受控的值来看,这是具有挑战性的。从可能的各种格式来看,准确地做到这一点是不可行的。七月,七月,六月,六月,一月,一月等等......这甚至没有考虑到肥胖的指法。
  • @SeanLange 胖指法...我要偷那个!

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


【解决方案1】:

你需要一个Split function

如果您首先按&lt;space&gt; 拆分,则很容易创建正则表达式

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加入没有匹配的元素

【讨论】:

  • 有不少 - 这是一个很好的开始
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
相关资源
最近更新 更多