Я бы использовал функции рабочей лошадки SUBSTRING_INDEX
и STR_TO_DATE
. Функция TIMESTAMPDIFF
может вычислять разницу между значениями DATETIME.
(Я собираюсь пропустить обсуждение о том, как не хранить несколько дат и времени в одном большом текстовом столбце. Достаточно сказать, что это анти-шаблон SQL, и это плохая практика.)
Строковая обработка в SQL неэлегатна (SQL становится ужасно быстрым), но мы можем справиться с некоторыми элементарными, четко определенными операциями.
Поскольку у нас есть регулярные разделители ##
в значениях столбцов, если мы имеем это в качестве гарантии, мы можем использовать функцию SUBSTRING_INDEX
для извлечения частей между этими разделителями.
В качестве демонстрации:
SELECT -- extract string parts
SUBSTRING_INDEX(t.field1,'##',1) AS d1_str
, SUBSTRING_INDEX(SUBSTRING_INDEX(t.field1,'##',3),'##',-1) AS d2_str
-- convert stringparts to DATETIME
, STR_TO_DATE( SUBSTRING_INDEX(t.field1,'##',1) ,'%Y-%m-%d %Hh%i') AS d1_dt
, STR_TO_DATE( SUBSTRING_INDEX(SUBSTRING_INDEX(t.field1,'##',3),'##',-1) ,'%Y-%m-%d %Hh%i') AS d2_dt
-- calculate time difference (in minutes) of the DATETIME
, TIMESTAMPDIFF(MINUTE
, STR_TO_DATE( SUBSTRING_INDEX(t.field1,'##',1) , '%Y-%m-%d %Hh%i')
, STR_TO_DATE( SUBSTRING_INDEX(SUBSTRING_INDEX(t.field1,'##',3),'##',-1) , '%Y-%m-%d %Hh%i')
) AS diff_minutes
FROM ( SELECT '1'+0 AS id, '2018-06-03 09h56##firstname.lastname##2018-06-03 16h45##firstname.lastname' AS field1
UNION ALL SELECT '2'+0, '2018-02-06 17h24##firstname.lastname##2018-02-06 21h03##firstname.lastname'
UNION ALL SELECT '3'+0, '2018-01-01 02h23##firstname.lastname##2018-01-01 17h24##firstname.lastname'
) t
возвращается:
d1_str d2_str d1_dt d2_dt diff_minutes
---------------- ---------------- ------------------- ------------------- ------------
2018-06-03 09h56 2018-06-03 16h45 2018-06-03 09:56:00 2018-06-03 16:45:00 409
2018-02-06 17h24 2018-02-06 21h03 2018-02-06 17:24:00 2018-02-06 21:03:00 219
2018-01-01 02h23 2018-01-01 17h24 2018-01-01 02:23:00 2018-01-01 17:24:00 901