Mysql Рассчитать разницу во времени между отметками времени в том же поле, содержащем текст? - PullRequest
0 голосов
/ 25 июня 2019

Можно ли рассчитать разницу во времени из отметки времени в том же поле, содержащем текст?Вот моя таблица даты:

 ID, FIELD1, totalTime
 '1', '2018-06-03 09h56##firstname.lastname##2018-06-03 16h45##firstname.lastname', ''
 '2', '2018-02-06 17h24##firstname.lastname##2018-02-06 21h03##firstname.lastname', ''
 '3', '2018-01-01 02h23##firstname.lastname##2018-01-01 17h24##firstname.lastname', ''

Поэтому мне нужно рассчитать время для каждой строки: EX: (2018-02-03 16h45) - (2018-02-03 09h56)

Мои знания SQL неплохие, но я не могу понять, как мне поступить так же в одной области.

Спасибо,

Элизабет

1 Ответ

0 голосов
/ 25 июня 2019

Я бы использовал функции рабочей лошадки 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...