从字符串中剥离多种格式的日期
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
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加入回来,没有匹配的元素
我有一列字符串,名为 "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
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加入回来,没有匹配的元素