почему функция timediff mysql дает неправильный вывод? - PullRequest
0 голосов
/ 25 января 2019

mysql не дает ожидаемого вывода, когда я использую функцию timediff. Версия mysql - 5.5

.
SELECT TIME_FORMAT(TIMEDIFF( '2018-06-18 08:20:00','2019-01-25 14:29:00'),'%H:%i:%s');

Ответы [ 3 ]

0 голосов
/ 25 января 2019

Ожидаемый результат: общее количество часов, минут, секунд, вот что вы хотите:

SELECT 
CONCAT(
    TIMESTAMPDIFF(HOUR, '2018-06-18 08:20:00', '2019-01-25 14:29:00'), ":", 
    TIMESTAMPDIFF(minute, '2018-06-18 08:20:00', '2019-01-25 14:29:00'), ":",
    TIMESTAMPDIFF(SECOND, '2018-06-18 08:20:00', '2019-01-25 14:29:00'));

Это приведет к:

5310:318609:19116540
0 голосов
/ 25 января 2019

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

Но если вычислить TIMEDIFF между частями TIMESTAMP, то все в порядке. В любом случае, за минуты и секунды.

Разницу в часах между двумя временными метками можно рассчитать с помощью TIMESTAMPDIFF.

Таким образом, приведенный ниже запрос объединяет разницу в часах (например, «5310») с полезной частью разницы во времени (например, «: 09: 10»)

Пример фрагмента:

SELECT 
CONCAT(TIMESTAMPDIFF(HOUR, ts1, ts2), RIGHT(TIMEDIFF(CAST(ts1 AS TIME), CAST(ts2 AS TIME)), 6)) as tm
FROM (
  SELECT TIMESTAMP('2018-06-18 08:20:00') ts1, TIMESTAMP('2019-01-25 14:29:10') ts2
  union all
  SELECT TIMESTAMP('2019-01-25 14:29:10') ts1, TIMESTAMP('2018-06-18 08:20:00') ts2
) q;

Возвращает

tm
-------------
5310:09:10 
-5310:09:10 

Тест по дБ <> скрипка здесь

0 голосов
/ 25 января 2019

TIMEDIFF не может иметь более 839 часов, и, следовательно, вы не сможете измерить разницу для более длинных диапазонов, чем ~ 35 дней.В этом случае вы можете сделать следующее:

  • Используйте TIMESTAMPDIFF, чтобы получить секунды
  • Преобразовать секунды в hh:m:ss

Например

SET @seconds := (SELECT TIMESTAMPDIFF(second, '2018-06-18 08:20:00','2019-01-25 14:29:00'));
SELECT CONCAT(FLOOR(@seconds/3600),':',FLOOR((@seconds%3600)/60),':',(@seconds%3600)%60) AS difference;

Если вы хотите выполнить оба в одном запросе, вы можете использовать следующее:

SELECT CONCAT(FLOOR(TIMESTAMPDIFF(second, '2018-06-18 08:20:00','2019-01-25 14:29:00')/3600),
':',FLOOR((TIMESTAMPDIFF(second, '2018-06-18 08:20:00','2019-01-25 14:29:00')%3600)/60),
':',(TIMESTAMPDIFF(second, '2018-06-18 08:20:00','2019-01-25 14:29:00')%3600)%60) 
AS difference;

Вот SQLFiddle1 и SQLFiddle2 .

...