2010-02-01 6 views
34

Я пытаюсь получить TimeDiff из моей таблицы и преобразовать его в час (это за час выставленной службы)MySQL TimeDiff до нескольких часов

ВЫБРАТЬ TIME_TO_SEC (TimeDiff (ENDDATE, STARTDATE))/3600 ОТ задачи>

где ENDDATE и STARTDATE в формате даты и времени

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

+0

Возможный [дубликат] (http://stackoverflow.com/questions/3621440/mysql-how-to-get -точная-разностный из-многочасовых между-двух дат). – Kermit

+3

Я думаю, что все пропустили очень важный момент здесь - потому что это нетехник. Вещи, выставленные по часам, тарифицируются по часам **, ** **, а не ** завершены **. Таким образом, все эти ответы, вероятно, необходимо округлить. Например, 1 час 1 минута == 2 часа оплачивается (так же, как платить за парковку вашего автомобиля и т. Д.) – Mawg

ответ

11
HOUR(TIMEDIFF(endDate, startDate)) 

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

+0

Не забывайте, что эта функция округляется –

4

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

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

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

+1

Лучший ответ для точности - 'TIMEDIFF' и' TIMESTAMPDIFF' не учитывают дневной свет сбережения времени изменения. –

+0

, как сказано в предыдущем комментарии, это объясняет DST, что является удивительным! – Gusmar

33

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'); 

И так lution может быть:

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

Правильные параметры '' 'TIMESTAMPDIFF (HOUR, startDate, endDate)' '' – Gathole

+0

Как ни странно, UNIX_TIMESTAMP возвращает 0, а TimeStampDiff возвращает NULL для всех значений в MySQL Version ~ 5.0 (очень устаревший). В этом случае работал подход ОП. – HoldOffHunger

+1

Обратите внимание, что 'TIMEDIFF' и' TIMESTAMPDIFF' не учитывают изменения дневного сбережения. Ответ @Donny Kurnia ниже работает лучше всего, если полученный час/потеря имеет важное значение в вашем случае. –

5

например: STARTDATE 2010-01-31 00:00:00, ENDDATE 2010-01-31 19:24:22

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. Я думаю, что первый из них является наиболее ЭФФЕКТИВНАЯ. Благодаря !!

+3

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

+0

SELECT TIME_TO_SEC (TIMEDIFF (endDate, startDate))/3600 ОТ задач является хорошим – avguchenko

25

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

TIME_TO_SEC(TIMEDIFF(endDate, startDate))/3600 as hours 
+2

В этом случае, поскольку OP говорит «это для ежечасно выставленного счета», я предполагаю, что вы захотите округлить любую фракцию вверх до следующий в течение час. Итак, да, другой парень может ошибаться, потому что он возвращает INTEGER, но похоже, что OP хочет целое число ** округленное ** – Mawg

6
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 значений ,

+0

Красиво проиллюстрировано пять лет назад. Отлично сработано. – Landslyde

5

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

Hour(TIMEDIFF(date1,date2)) as Hour1 

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

Minute(TIMEDIFF(date1,date2)) as Minute1 

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

Second(TIMEDIFF(date1,date2)) as Second1 
+1

Я думаю, что это отчасти неверно?Минуты и секунды не возвращают время как минуты или секунды. Они возвращают минуту или вторую часть значения. Так, например, «вторая» функция всегда возвращает значение от 0 до 59. «Час», похоже, ведет себя по-другому http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions. HTML # function_second –

0
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 

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