У меня есть запрос MySQL, структурированный следующим образом:
SELECT time(c.start_time),
time(c.end_time),
time(c.end_time) - time(c.start_time) as 'opening_hours'
FROM my_shop c;
Данные для времени начала и окончания: 1970-01-01 07:00:00 и 1970-01-01 19:00:00 соответственно.
На моем локальном компьютере этот запрос возвращает:
| 07:00:00 | 19:00:00 | 12 |
Однако на удаленной машине (производственной) он возвращается
| 07:00:00 | 19:00:00 | 120000 |
Есть идеи относительно того, почему это может происходить и как это исправить?
Оба набора данных идентичны, и, насколько мне известно, обе установки MySQL идентичны.
Любая помощь горячо приветствуется.
Обновлять:
Казалось бы, версии MySQL немного отличаются: 5.0.27-community-nt против 5.0.51b-community-nt. Это, скорее всего, причина.
djt поднял хороший аргумент в том, что в решении Билла не учитываются минуты. Кроме того, это решение djt не совсем то, что мне нужно.
Итак, я предполагаю, что вопрос превратился в то, как вычесть два раза, включая минуты, чтобы:
1970-01-01 19:00:00 - 1970-01-01 07:00:00 = 12
1970-01-01 19:00:00 - 1970-01-01 07:30:00 = 11.5
1970-01-01 19:00:00 - 1970-01-01 07:45:00 = 11.25
и т.п.






Я бы сделал так:
SELECT TIME(c.start_time),
TIME(c.end_time),
EXTRACT(HOUR FROM TIMEDIFF(TIME(c.end_time), TIME(c.start_time)))
AS 'opening_hours'
FROM my_shop c;
Я не уверен. Я бы посоветовал проверить версии MySQL на каждой машине. «ВЫБРАТЬ ВЕРСИЮ ();»
Извините, счет, я не видел вашего ответа перед отправкой. Наши решения похожи, но я не верю, что у вас будут отображаться неполные часы (например, если дата окончания была 19:30).
Вы правы, он покажет только целые часы как целое число. Но это то, о чем просил ОП.
Обычно одни и те же методы, вызывающие разный вывод, создают впечатление, что это либо другая конфигурация, либо другая версия сервера. Я не могу помочь с этим, но, возможно, стоит попробовать следующий метод в вашем запросе:
SELECT TIME(c.start_time), TIME(c.end_time), TIMEDIFF(TIME(c.end_time), TIME(c.start_time)) as 'opening_hours' FROM my_shop c;
Это даст вам отформатированную метку времени открытия часов, минут и секунд.
Интересно, что это дает «12:00:00», что, как я полагаю, является тем, что мой запрос возвращает на этой конкретной машине без двоеточий. Возможно, в конфигурации MySQL есть другой параметр форматирования даты. Есть идеи?
Есть ли лучшее решение, чем это:
SELECT EXTRACT(HOUR FROM TIMEDIFF(TIME(c.end_time), TIME(c.start_time)))
+ ((EXTRACT(MINUTE FROM TIMEDIFF(TIME(c.end_time), TIME(c.start_time))))/60)
FROM my_shop c;
Вы знаете, что можете сделать ЭКСТРАКТ (HOUR_MINUTE FROM ...)?
Это будет работать на желаемой машине. В идеале я не хочу менять код, но полагаю, если это единственное решение, пусть будет так. Я все еще очень хотел бы знать, почему это происходит, хотя это довольно сбивает с толку.