MySQL TimeDiff часов - PullRequest
       5

MySQL TimeDiff часов

38 голосов
/ 01 февраля 2010

Я пытаюсь получить timediff из моей таблицы и преобразовать его в часы (это для почасовой оплаты услуг)

SELECT TIME_TO_SEC (TIMEDIFF (endDate, startDate)) / 3600 ОТ задач>

где endDate и startDate представлены в формате datetime

Есть ли другой способ (более эффективный) для выполнения этой задачи? Спасибо!

Ответы [ 10 ]

36 голосов
/ 01 февраля 2010

TIMEDIFF(endDate, startDate) выводит данные в формате DateTime, такие плоские, что их можно метить по времени и делить на (60 * 60)

SELECT (UNIX_TIMESTAMP(TIMEDIFF(endDate, startDate))/(60*60)) AS hours_difference
FROM tasks

Редактировать: В качестве альтернативы TimestampDiff может также предоставить правильное решение более элегантным способом, предоставляя его пример:

SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01');

И ваше решение может быть:

SELECT TIMESTAMPDIFF(HOUR, endDate, startDate) AS hours_different
FROM tasks
28 голосов
/ 27 сентября 2011

ВНИМАНИЕ, в этой цепочке чаще всего голосуют НЕПРАВИЛЬНО!Использование HOUR вернет только часы как целое число.Ниже будет исправлен самый популярный ответ, чтобы часы возвращались как целое число, а минуты - как десятичное число (т.е. 6,5 часа).

TIME_TO_SEC(TIMEDIFF(endDate, startDate))/3600 as hours
11 голосов
/ 01 февраля 2010
HOUR(TIMEDIFF(endDate, startDate))

может сработать - если я правильно читаю документы.

8 голосов
/ 19 апреля 2012
TIMESTAMPDIFF(HOUR, startDate, endDate)

- лучший способ сделать это, потому что он работает с большими временными интервалами, как

TIMESTAMPDIFF(HOUR, "2012-01-01 00:00:00", "2050-01-01 00:00:00")

Результат: 333120

, а

HOUR(TIMEDIFF("2050-01-01 00:00:00", "2012-01-01 00:00:00"))

Результат: 838

не удается.

Как мы видим из приведенного выше примера, он неожиданно работает даже за пределами ограничения по времени в 2038 году.

Максимальное количество часов, которое возвращается HOUR(TIMEDIFF(dateEnd, dateStart)), равно 838, поскольку TIMEDIFF ограничено диапазоном, допустимым для значений TIME.

6 голосов
/ 01 февраля 2010

Вы можете использовать UNIX_TIMESTAMP для выполнения расчетов в запросе SELECT.

SELECT (UNIX_TIMESTAMP(endDate)-UNIX_TIMESTAMP(startDate))/3600 hour_diff
  FROM tasks

UNIX_TIMESTAMP преобразование даты и времени в число секунд с начала эпохи. Вы можете вычесть обе отметки времени, чтобы получить разницу в секундах. Разделите его на 3600, и вы получите разницу в часах.

5 голосов
/ 13 ноября 2013

для получения разности в час:

Hour(TIMEDIFF(date1,date2)) as Hour1

для получения разницы в минуту:

Minute(TIMEDIFF(date1,date2)) as Minute1

для получения разницы в секунду:

Second(TIMEDIFF(date1,date2)) as Second1
5 голосов
/ 01 февраля 2010

например: startDate 2010-01-31 00:00:00, endDate 2010-01-31 19: 24: 22 * ​​1001 *

SELECT (UNIX_TIMESTAMP(dateFin)-UNIX_TIMESTAMP(dateDebut))/3600 hour_diff
FROM tasks

SELECT TIME_TO_SEC(TIMEDIFF(endDate,startDate))/3600
FROM tasks 

возвращает 19.4061, что хорошо

SELECT TIMESTAMPDIFF(HOUR, endDate, startDate) AS hours_different
FROM tasks

Возвращает только часы, в то время как мне также нужно конвертировать минуты.

SELECT (UNIX_TIMESTAMP(TIMEDIFF(endDate, startDate))/(60*60)) AS hours_difference
FROM tasks

возвращает 0. Я думаю, что первый является наиболее эффективным. Спасибо !!

1 голос
/ 07 июня 2018

Вы можете использовать mysql funcion timestampdiff, как показано ниже

TIMESTAMPDIFF(HOUR, '2018-06-01 00:00:00', '2018-06-01 12:00:00') 
1 голос
/ 31 марта 2017
select hour(timediff('2017-01-01 00:00:00', '2017-01-01 00:01:00'));
 return 1

select hour(timediff('2017-01-01 00:01:00', '2017-01-01 00:00:00'));
 return 1 

select time_to_sec(timediff('2017-01-01 00:00:00', '2017-01-01 00:00:05'));
return -5

select time_to_sec(timediff('2017-01-01 00:00:00', '2017-01-01 00:00:05'))/60 as 'minutes' ;
return -0.0833  

если у вас есть секунды, вы можете конвертировать их как хотите или что и часы (..) не будут использовать его при сравнении, потому что это всегда положительное значение

0 голосов
/ 01 февраля 2010
TIMEDIFF(endDate, startDate) / 10000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...