2010-02-01 19 views
34

que estoy tratando de conseguir el TIMEDIFF de mi mesa y convertirlo en horas (que es para un servicio cada hora facturado)MySQL TIMEDIFF a horas

SELECT TIME_TO_SEC (TIMEDIFF (endDate, startDate))/3600 DESDE tareas>

donde endDate y startDate están en formato de fecha y hora

¿hay otra manera (más eficiente) a realizar esta tarea? Gracias!

+0

Posible [duplicado] (http://stackoverflow.com/questions/3621440/mysql-how-to-get -exact-difference-of-hours-between-two-dates). – Kermit

+3

Creo que todos perdieron un punto muy importante aquí, porque no es técnico. Las cosas facturadas por horas se facturan normalmente por la hora ** iniciada **, no ** completada **. Entonces, todas estas respuestas probablemente necesiten redondear. Por ejemplo, 1 hora 1 minuto == 2 horas facturables (como pagar para estacionar su automóvil, etc.) – Mawg

Respuesta

11
HOUR(TIMEDIFF(endDate, startDate)) 

podría funcionar, si estoy leyendo los documentos correctamente.

+0

No olvide que esta función redondea –

4

Puede usar UNIX_TIMESTAMP para hacer el cálculo en la consulta SELECCIONAR.

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

UNIX_TIMESTAMP convert de fecha y hora con el número de segundos de época. Puede restar ambas marcas de tiempo para obtener diferencia en segundo. Dividirlo con 3600 le dará la diferencia en hora.

+1

La mejor respuesta para la precisión - 'TIMEDIFF' y' TIMESTAMPDIFF' no tienen en cuenta la luz del día cambios de tiempo de ahorro. –

+0

como se dijo en el comentario anterior, esto explica el horario de verano, ¡que es increíble! – Gusmar

0
TIMEDIFF(endDate, startDate)/10000 
33

TIMEDIFF(endDate, startDate) salidas en formato DateTime, tan plana que a marca de tiempo y devide por (60 * 60)

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

Editar: Alternativamente, TimestampDiff puede también proporcionar una solución válida en más manera elegante que proporciona su ejemplo:

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

Y su tan lution puede ser:

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

Corrija los parámetros '' 'TIMESTAMPDIFF (HOUR, startDate, endDate)' '' – Gathole

+0

Curiosamente, UNIX_TIMESTAMP devuelve 0 y TimeStampDiff devuelve NULL para todos los valores en la versión ~ 5.0 de MySQL (muy desactualizado). El enfoque de OP funcionó en ese caso. – HoldOffHunger

+1

Tenga en cuenta que 'TIMEDIFF' y' TIMESTAMPDIFF' no tienen en cuenta los cambios en el horario de verano. La respuesta de @Donny Kurnia a continuación funciona mejor si la hora ganado/perdido es importante en su caso. –

5

por ejemplo: 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 

rendimientos 19.4061 que es bueno

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

Solo devuelve horas mientras que también necesito minutos para convertir.

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

vuelve 0. creo que el primero es el más eficiente. Gracias !!

+3

Debe elegir una de las respuestas como aceptada, en lugar de crear respuestas como esta. Además, use el comentario en las respuestas apropiadas, en lugar de reescribir o volver a citar. –

+0

SELECT TIME_TO_SEC (TIMEDIFF (endDate, startDate))/3600 FROM tasks es bueno – avguchenko

25

NOTA ¡la respuesta más votada en esta cadena es INCORRECTA! Usar HOUR solo devolverá horas como un entero. A continuación se corregiría la respuesta más popular a las horas de retorno como un número entero y los minutos como un decimal (es decir, 6,5 horas).

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

En cuyo caso, como OP dice "es por un servicio facturado por hora", imagino que querría redondear cualquier fracción hacia arriba al la siguiente hora completa. Entonces, sí, el otro tipo podría estar equivocado, porque él devuelve un INTEGER, pero parece que OP quiere un entero ** redondeado ** – Mawg

6
TIMESTAMPDIFF(HOUR, startDate, endDate) 

es la mejor manera de hacerlo, ya que funciona con intervalos de tiempo grandes, como

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

Resultado: 333120

mientras

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

Resultado : 838

falla.

Como vemos en el ejemplo anterior, sorprendentemente se funciona incluso más allá de la limitación de marca de tiempo en años 2038.

El máximo de horas que son devueltos por HOUR(TIMEDIFF(dateEnd, dateStart)) es 838, porque TIMEDIFF está limitado a la gama permitida para TIME valores .

+0

Bien ilustrado de hace cinco años. Bien hecho. – Landslyde

5

para conseguir Difference en horas:

Hour(TIMEDIFF(date1,date2)) as Hour1 

para conseguir Difference en el minuto:

Minute(TIMEDIFF(date1,date2)) as Minute1 

para conseguir Difference en segundo lugar:

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

Creo que esto es en parte incorrecto?Las funciones de minutos y segundos no devuelven el tiempo en minutos o segundos. Devuelven la segunda o segunda parte del valor. Entonces, por ejemplo, la "segunda" función siempre devuelve un valor entre 0 y 59. "Hora" parece comportarse de manera diferente 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 

si usted tiene la segundos puedes convertirlo como usted quiere o lo que y horas (..) no lo usará cuando lo comparo porque siempre es un valor positivo

Cuestiones relacionadas