Это мой запрос:
SELECT TIMEDIFF(end_time,start_time) AS "total" FROM `metrics`;
который дает мне:
116:12:10
означает 116 часов, 12 минут и 10 секунд.
Вместо этого я хочу сказать 4 дня 20 часов, 12 минут и т.д.
Это мой запрос:
SELECT TIMEDIFF(end_time,start_time) AS "total" FROM `metrics`;
который дает мне:
116:12:10
означает 116 часов, 12 минут и 10 секунд.
Вместо этого я хочу сказать 4 дня 20 часов, 12 минут и т.д.
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, будут работать.
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 '
)
Попробуйте
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;
Это даст вам разбивку по годам, месяцам, дням, часам и минутам между двумя датами.
Надеюсь, это поможет кому-то.
Самый простой способ сделать это -
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'
)
)
Я использовал ответ, заданный 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