#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.