Вычитание времен MySQL несовместимо на разных машинах

У меня есть запрос 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

и т.п.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
0
779
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я бы сделал так:

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;

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

abarax 12.12.2008 03:55

Я не уверен. Я бы посоветовал проверить версии MySQL на каждой машине. «ВЫБРАТЬ ВЕРСИЮ ();»

Bill Karwin 12.12.2008 04:21

Извините, счет, я не видел вашего ответа перед отправкой. Наши решения похожи, но я не верю, что у вас будут отображаться неполные часы (например, если дата окончания была 19:30).

djt 12.12.2008 04:33

Вы правы, он покажет только целые часы как целое число. Но это то, о чем просил ОП.

Bill Karwin 13.12.2008 03:10

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

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 есть другой параметр форматирования даты. Есть идеи?

abarax 12.12.2008 03:58

Есть ли лучшее решение, чем это:

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 ...)?

Bill Karwin 13.12.2008 03:10

Другие вопросы по теме