Извлечение даты и времени из строки в T-SQL - PullRequest
0 голосов
/ 16 октября 2018

В SQL хранится следующая строка:

Заявка, утвержденная Джоном Доу - MDat30 / 01/2018 10: 54: 31

с использованием следующего T-SQL функция:

convert (datetime, substring(MD_SIGNATURE, charindex('/', MD_SIGNATURE,0)-2, 10),105) as MD_SIGN_DATE

Это выводит следующее:

2018-01-30 00: 00: 00.000

Мне нужна помощь вполучение всей метки времени, включая доли секунд, например:

2018-01-30 10: 54: 31

Спасибо.

Ответы [ 4 ]

0 голосов
/ 16 октября 2018

Вы можете использовать PATINDEX, если знаете шаблон:

SELECT
    str,
    CONVERT(DATETIME, SUBSTRING(str, PATINDEX('%[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]%', str), 19), 103) AS dt
FROM (VALUES
    ('Application approved by John Doe - MDat30/01/2018 10:54:31 Kitchen Sink')
) tests(str)

Приведенный выше пример можно настроить так, чтобы он возвращал ноль, если дата не найдена (подсказка: NULLIF).Результат:

| str                                                                     | dt                      |
|-------------------------------------------------------------------------|-------------------------|
| Application approved by John Doe - MDat30/01/2018 10:54:31 Kitchen Sink | 2018-01-30 10:54:31.000 |
0 голосов
/ 16 октября 2018

Намного проще было бы использовать RIGHT (на основе имеющегося у нас образца 1 ).Предполагая, что формат всегда dd/MM/yyyy hh:mm:ss, а дата всегда является последней частью строки:

DECLARE @s varchar(100) = 'Application approved by John Doe - MDat30/01/2018 10:54:31';

SELECT CONVERT(datetime2(0),RIGHT(@s,19),103);
0 голосов
/ 16 октября 2018

Небольшое изменение кода @larnu.

Вместо right () я использовал substring ().Потому что Right () можно использовать, если дата в конце.Но подстрока может извлекать дату независимо от места.

DECLARE @s varchar(100) = 'Application approved by John Doe - MDat30/01/2018 10:54:31';

SELECT CONVERT(datetime2(0),Substring(@s,charindex('/', @s,0)-2,19),103);
0 голосов
/ 16 октября 2018

Если последний параметр SUBSTRING длиннее, чем оставшаяся часть строки, будет возвращена вся оставшаяся строка.Так что просто измените свой последний параметр.

convert (datetime, substring(MD_SIGNATURE, charindex('/', MD_SIGNATURE,0)-2, LEN(MD_SIGNATURE)),105) as MD_SIGN_DATE

И вот вы здесь.

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