2016-10-21 4 views
0

Я хотел бы показать разницу во времени между двумя датами и моим текущим подходом, за исключением того, что, когда часы, минуты и секунды меньше 10, он отображает только один и я хотел бы добавить к нулевому значению.PHP-MySQL: добавить ведущий ноль к TIMESTAMPDIFF Конкатенированный вывод

запрос выглядит следующим образом.

SELECT *, 
CONCAT(
MOD(TIMESTAMPDIFF(hour, start_time, end_time), 24), ':', 
MOD(TIMESTAMPDIFF(minute, start_time, end_time), 60), ':', 
MOD(TIMESTAMPDIFF(second, start_time, end_time), 60) 
) AS total_time 
FROM test_db 

он выводит следующие результаты, когда время цифра меньше, чем 10.

4:53:21 
10:1:9 
6:3:8 

Моя цель для вывода, чтобы отобразить следующим образом.

04:53:21 
10:01:09 
06:03:08 

Примечание: Я передаю это приводит к массиву, который затем отправляется на обратный вызов AJAX для вывода результатов на динамически сгенерированной таблицы. Если есть лучшее решение, которое может работать с помощью jquery/ajax, то я более чем открыт для любых предложений. Однако, поскольку в конечном итоге мне придется экспортировать эти результаты в файл excel, я вместо этого склоняюсь к поисковому запросу.

ответ

1

Один из подходов будет предварять ведущий нуль, а затем принять крайние правые два символа ...

RIGHT(CONCAT('0', expr),2) 

Это работает только в том случае, если значения expr неотрицательны и не более двух цифр.


В совершенно иной подход, вы можете получить разницу в секундах, и преобразовать в тип данных TIME ...

SEC_TO_TIME(MOD(TIMESTAMPDIFF(SECOND,start_time,end_time),24*60*60)) 

час часть все еще может быть менее двух цифр, так что вы могли бы примените тот же шаблон, что и выше, добавив символ '0' и возьмите самые правые восемь символов.

Или можно просто обернуть, что в DATE_FORMAT(timeexpr, '%T')

+0

Я тестирую ваши предложения прямо сейчас Посмотрите, какой из них будет работать. Я отправлю свои результаты в ближайшее время. – BlueSun3k1

+0

Я получил его на работу. Спасибо, что направил меня в правильном направлении. SEC_TO_TIME (MOD (..) работал, но он продолжал возвращать 2 цифры в течение часа с 3-мя цифрами, но то я вспомнил, что вы упомянули, что я буду получать максимум 2 цифры из-за MOD, поэтому я сделал самое простое, что мог. Убрал часть MOD и использовал SEC_TO_TIME (TIMESTAMPDIFF (SECOND, start_time, end_time)), а выход был 475 : 41: 34, а также 02:17:41, поэтому миссия выполнена капитаном. Спасибо за помощь. – BlueSun3k1

+1

Обратите внимание, что тип данных 'TIME' позволяет использовать значения в диапазоне' '-838: 59: 59''' '838 : 59: 59''. Значения часов 839 или выше вызовут переполнение. Мой пример включал 'MOD', потому что это то, что оригинал запрос выполнял.(Я ответил только на вопрос о добавлении «отсутствующих» ведущих нулей. – spencer7593

0

Try с:

DATE_FORMAT(concat part, '%H:%m:%s') 

и посмотреть, если он работает для вас

+0

Thanks krasipenkov. Я попытался установить DATE_FORMAT как DATE_FORMAT (CONCAT (MOD (TIMESTAMPDIFF (....), '% H:% m:% s'), как вы предложили, но возвращает NULL. – BlueSun3k1

1

Вы можете использовать TIME_FORMAT и SEC_TO_TIME в комбинации и избегать использования функции MOD(), чтобы не ограничивать часов до выхода 2 цифры.

SELECT TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(second, start_time, end_time)),'%H:%i:%s'); 
Смежные вопросы