sql - извлекает дату из строки - PullRequest
0 голосов
/ 01 октября 2019

В моей таблице есть столбец description со строковым значением, подобным этому

"PK Event System Time: 31 January 2019 02:09  OK TO RIGOUR till 08:00 on Thursday Morning"

Мне нужно извлечь часть даты из этого в SQL Server.

Ожидаемый результат:

 31 January 2019 02:09

Ответы [ 3 ]

3 голосов
/ 01 октября 2019

В зависимости от того, что вы предоставляете, вы можете просто использовать функции CHARINDEX() и SUBSTRING() как:

SELECT TRY_CAST(
       SUBSTRING(V, 
                 CHARINDEX(':', V)+2, 
                 CHARINDEX(':', V, CHARINDEX(':', V)+2) - CHARINDEX(':', V)+2
                ) AS DATETIME)
FROM
(
  VALUES
  ('PK Event System Time: 31 January 2019 02:09  OK TO RIGOUR till 08:00 on Thursday Morning'),
  ('Whatever: 01 Jun 2012 09:02  OK TO RIGOUR')
) T(V)

Обратите внимание, что дата и время всегда должны быть после ":". Если это не так, предоставьте хороший пример данных.

Демонстрация в Интернете

1 голос
/ 01 октября 2019

Следующее работает для вашего одного примера. Я зависел от даты, начинающейся после первого двоеточия в текстовой строке, а затем от времени, содержащего второе вхождение двоеточия, чтобы определить конец даты и времени.

With TestValues AS
(
SELECT V.TextValue
FROM (VALUES
        ('PK Event System Time: 31 January 2019 02:09  OK TO RIGOUR till 08:00 on Thursday Morning')
     ) V(TextValue)

)
SELECT T.TextValue, TRY_CAST(DateString.DateString AS datetime) AS DateTimeVersion
FROM TestValues AS T
CROSS APPLY (SELECT NULLIF(CHARINDEX(':',T.TextValue),0) + 2 AS N) AS DateStart
CROSS APPLY (SELECT NULLIF(CHARINDEX(':',T.TextValue,DateStart.N),0) + 3 AS N) AS DateEnd
CROSS APPLY (SELECT SUBSTRING(T.TextValue,DateStart.N,DateEnd.N - DateStart.N) AS DateString) AS DateString
0 голосов
/ 01 октября 2019

Вы можете использовать CHARINDEX и SUBSTRING.

Если "OK TO RIGOR till" эта строка всегда присутствует в ваших данных, тогда вы проверяете следующий запрос

select Trim( SUBSTRING(tbl.str, CHARINDEX(':',tbl.str) + 2 , (CHARINDEX('OK',tbl.str))  - (CHARINDEX(':',tbl.str) + 2))) from (SELECT V.str
FROM (VALUES
        ('PK Event System Time: 31 January 2019 02:09  OK TO RIGOUR till 08:00 on Thursday Morning')
     ) V(str)

  )tbl

http://sqlfiddle.com/#!18/9eecb/59559

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