2015-11-25 3 views
0

я колонна строк, называемый «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 
... 
... 

Есть быстрый способ сделать это или мне нужно рассматривать каждый формат индивидуально?

+0

В вашем примере месяц всегда 3-х символов, так что, может быть, вы могли бы использовать это. Найдите «слова» (единицы, разделенные пробелами), содержащие 3 буквы и (некоторые?) Цифры. – HoneyBadger

+2

Не думайте, что вы найдете простое решение для этого с несколькими форматами. – Tanner

+0

@ Таннер вы мало веры ... Я все еще надеюсь – whytheq

ответ

1

Вам нужен Split function

Если разделить первое на <space> легко создавать регулярные expresion для

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 

OUTPUT

  • Нужно присоединиться к списку из 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 присоединиться обратно без согласующих элементов

+0

Есть ли больше формата данных или только эти 4? –

+0

немало - это отличное начало – whytheq

Смежные вопросы