MySQL конвертирует вывод timediff в день, час, минуту, второй формат

Это мой запрос:

SELECT TIMEDIFF(end_time,start_time) AS "total" FROM `metrics`;

который дает мне:

116:12:10

означает 116 часов, 12 минут и 10 секунд.

Вместо этого я хочу сказать 4 дня 20 часов, 12 минут и т.д.

Ответ 1

SELECT CONCAT(
FLOOR(HOUR(TIMEDIFF('2010-01-06 08:46', '2010-01-01 12:30')) / 24), ' days ',
MOD(HOUR(TIMEDIFF('2010-01-06 08:46', '2010-01-01 12:30')), 24), ' hours ',
MINUTE(TIMEDIFF('2010-01-06 08:46', '2010-01-01 12:30')), ' minutes')

Используйте свои end_time и start_time для фиксированных значений datetime в моем примере

Согласно двум комментариям ниже, это решение работает только в течение 35 дней. Если вы знаете, что между началом и до конца существует более 35 дней, т.е. Разница в течение месяца, не используйте его. Другие ответы здесь, используя TIMESTAMPDIFF, будут работать.

Ответ 2

SELECT 
CONCAT(
TIMESTAMPDIFF(day,'2001-01-01 00:00:00','2001-01-02 23:10:00') , ' dagen ',
MOD( TIMESTAMPDIFF(hour,'2001-01-01 00:00:00','2001-01-02 23:10:00'), 24), ' uren ',
MOD( TIMESTAMPDIFF(minute,'2001-01-01 00:00:00','2001-01-02 23:10:00'), 60), ' minuten '
)

Ответ 3

Попробуйте

SELECT @s:='2016-03-01' started, @e:= '2018-04-21' ended, 
FLOOR((@ms:=TIMESTAMPDIFF(MONTH,@s,@e))/12) yrs, (@ms%12) mns, 
@d:=TIMESTAMPDIFF(DAY,@s:=DATE_ADD(@s,INTERVAL @ms MONTH), @e) dys,
@hr:=TIMESTAMPDIFF(HOUR,@s:=DATE_ADD(@s, INTERVAL @d DAY),@e) hrs,
TIMESTAMPDIFF(MINUTE,TIMESTAMPADD(HOUR,@hr,@s),@e) mins;

Это даст вам разбивку по годам, месяцам, дням, часам и минутам между двумя датами.

Надеюсь, это поможет кому-то.

Ответ 4

Самый простой способ сделать это -

CONCAT(
  FLOOR(TIMESTAMPDIFF(SECOND, startDate, endDate) / 86400), ' days ',
  FLOOR((TIMESTAMPDIFF(SECOND, startDate, endDate) % 86400)/3600), ' hours ',
  FLOOR((TIMESTAMPDIFF(SECOND, startDate, endDate) % 3600)/60), ' minutes ',
  (TIMESTAMPDIFF(SECOND, startDate, endDate) % 60),  ' seconds'
)

Чтобы показывать только релевантную информацию, вам нужно сделать более сложную версию

IF(
  FLOOR(TIMESTAMPDIFF(SECOND, startDate, endDate) / 86400) = 0,
  IF(
    FLOOR((TIMESTAMPDIFF(SECOND, startDate, endDate) % 86400)/3600) = 0,
    IF(
      FLOOR((TIMESTAMPDIFF(SECOND, startDate, endDate) % 3600)/60) = 0,
      CONCAT((TIMESTAMPDIFF(SECOND, startDate, endDate) % 60),  ' seconds'),
      CONCAT(
        FLOOR((TIMESTAMPDIFF(SECOND, startDate, endDate) % 3600)/60), ' minutes ',
        (TIMESTAMPDIFF(SECOND, startDate, endDate) % 60),  ' seconds'
      )
    ),
    CONCAT(
      FLOOR((TIMESTAMPDIFF(SECOND, startDate, endDate) % 86400)/3600), ' hours ',
      FLOOR((TIMESTAMPDIFF(SECOND, startDate, endDate) % 3600)/60), ' minutes ',
      (TIMESTAMPDIFF(SECOND, startDate, endDate) % 60),  ' seconds'
    )
  ),
  CONCAT(
    FLOOR(TIMESTAMPDIFF(SECOND, startDate, endDate) / 86400), ' days ',
    FLOOR((TIMESTAMPDIFF(SECOND, startDate, endDate) % 86400)/3600), ' hours ',
    FLOOR((TIMESTAMPDIFF(SECOND, startDate, endDate) % 3600)/60), ' minutes ',
    (TIMESTAMPDIFF(SECOND, startDate, endDate) % 60),  ' seconds'
  )
)

Ответ 5

Я использовал ответ, заданный Bodgans, но добавил условие, чтобы вставить 0 перед количеством меньше 10.

CONCAT(
  IF(FLOOR(TIMESTAMPDIFF(SECOND, startDate, endDate) / 86400) < 10, '0', ''),    FLOOR(TIMESTAMPDIFF(SECOND, startDate, endDate) / 86400), ' days ',
  IF(FLOOR((TIMESTAMPDIFF(SECOND, startDate, endDate) % 86400)/3600) < 10, '0', ''), FLOOR((TIMESTAMPDIFF(SECOND, startDate, endDate) % 86400)/3600), ' hours ',
  IF(FLOOR((TIMESTAMPDIFF(SECOND, startDate, endDate) % 3600)/60) < 10, '0', ''), FLOOR((TIMESTAMPDIFF(SECOND, startDate, endDate) % 3600)/60), ' minutes ',
  IF((TIMESTAMPDIFF(SECOND, startDate, endDate) % 60) < 10, '0', ''), (TIMESTAMPDIFF(SECOND, startDate, endDate) % 60),  ' seconds'
)

Таким образом, мы можем получить результат следующим образом

09 days 10 hours 06 minutes 30 seconds