SQL: извлечь дату из строки - PullRequest
3 голосов
/ 05 июля 2010

Есть текстовое поле с именем myDate.Это поле может содержать 1) 'Финансовый год, заканчивающийся someDate ' или 2) ' dateA до' dateB '.

В ситуации 1), Я хочу установить в поле date1 = someDate .

В ситуации 2), я хочу установить в поле date1 = dateA и поле date2 = dateB .

Все даты ( someDate , dateA , dateB ) можно записать как 1/1 /2000, 1 января 2000 или 1 января 2000.

Как мне извлечь даты из myDate и вставить их в правильные поля?

1 Ответ

5 голосов
/ 05 июля 2010

Это не выглядит достаточно сложным, чтобы нуждаться в "правильном" регулярном выражении. Эти текстовые даты могут быть проанализированы непосредственно в тип DATETIME SQL без каких-либо изменений, как вы можете увидеть, выполнив этот запрос:

SELECT CAST('1/1/2000' AS DATETIME), CAST('January 1, 2000' AS DATETIME), CAST('Jan 1, 2000' AS DATETIME)

Чтобы получить -1 год и +1 день, просто используйте DATEADD, например,

SELECT DATEADD(dd, 1, DATEADD(yy, -1, 'January 1 2000'))

... итак, все, что вам действительно нужно сделать, это справиться с вашими двумя разными делами и забрать даты. Итак, что-то вроде:

SELECT
  CASE 
    WHEN myDate LIKE 'fiscal year ending %' THEN CAST(DATEADD(dd, 1, DATEADD(yy, -1, REPLACE(myDate, 'fiscal year ending ', ''))) AS DATETIME) 
    ELSE CAST(LEFT(myDate, PATINDEX('% to %', myDate)) AS DATETIME)
  END 'FromDate',
  CASE
    WHEN myDate LIKE 'fiscal year ending %' THEN CAST(REPLACE(myDate, 'fiscal year ending ', '') AS DATETIME)
    ELSE CAST(SUBSTRING(myDate, PATINDEX('% to %', myDate) + 4, 100) AS DATETIME)
  END 'ToDate'
FROM 
  ...whatever

... должен сделать свое дело. Я на самом деле не проверял это, но, надеюсь, это даст вам достаточно идеи, чтобы увидеть, к чему я клоню.

Обратите внимание, что некоторые из результатов, вероятно, будут зависеть от языковых настроек вашего сервера / базы данных. Например, если 1 января 2000 года всегда будет 1 января, 3/4/2000 третьего апреля или четвертого марта?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...