PHP-MySQL: добавить начальный ноль в объединенный вывод TIMESTAMPDIFF

#php #mysql #ajax

#php #mysql #ajax

Вопрос:

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

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

 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)  
  

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


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

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

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

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

Комментарии:

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

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

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

Ответ №2:

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

 SELECT TIME_FORMAT(SEC_TO_TIME(TIMESTAMPDIFF(second, start_time, end_time)),'%H:%i:%s');
  

Ответ №3:

Попробуйте с:

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

и посмотрите, работает ли это у вас

Комментарии:

1. Спасибо krasipenkov. Я попытался позиционировать DATE_FORMAT как DATE_FORMAT(CONCAT(MOD(TIMESTAMPDIFF(….), ‘%H:%m:%s’), как вы предложили, но он возвращает NULL.