Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Sumar tiempos en foreach()

Estas en el tema de Sumar tiempos en foreach() en el foro de PHP en Foros del Web. Hola, Estoy desarrollando una aplicación en la que necesito sumar tiempos que vienen de una base de datos. Es decir: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver ...
  #1 (permalink)  
Antiguo 12/05/2015, 12:27
 
Fecha de Ingreso: septiembre-2013
Ubicación: Madrid
Mensajes: 59
Antigüedad: 10 años, 7 meses
Puntos: 6
Exclamación Sumar tiempos en foreach()

Hola,

Estoy desarrollando una aplicación en la que necesito sumar tiempos que vienen de una base de datos.

Es decir:

Código PHP:
Ver original
  1. $datos= //codigo de peticion para base de datos
  2. $tiempo_total = 0;
  3. foreach($datos as $dato){
  4.           $tiempo_total += $dato->tiempo;
  5. }

Esto funciona con números pero al tener formato "H:i:s" no sé como sumarlos.

Espero su respuesta, gracias de antemano.

Un abrazo
  #2 (permalink)  
Antiguo 12/05/2015, 13:17
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Sumar tiempos en foreach()

Y seré curioso, pero... ¿Por qué no haces que la base te los devuelva sumados?
no es tan dificil, aunque hay que meterse con fucnioens de fehca y hora para hacerlo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 12/05/2015, 14:42
 
Fecha de Ingreso: septiembre-2013
Ubicación: Madrid
Mensajes: 59
Antigüedad: 10 años, 7 meses
Puntos: 6
Respuesta: Sumar tiempos en foreach()

¿Eso cómo es? La cuestión es que en realidad la aplicación funciona con otro foreach en el que obtengo id, pero para no complicarlo lo he puesto así.

En realidad la función es así:
Código PHP:
Ver original
  1. $datos = //Consulta a base de datos;
  2. $tiempo = "00:00:00";
  3. foreach($datos as $dato){
  4. $datos_tiempos = //Consulta a base de datos WHERE id_dato = $dato->id;
  5. foreach($datos_tiempos as $dato_tiempo){
  6. $tiempo += $dato_tiempo->tiempo;
  7. }
  8. }

Y ahí viene la suma de tiempos, no sé si se ve claro. En el primero obtengo los id de los que quiero los tiempos y de la tabla tiempos saco los tiempos asignados a esos id.

¿Cuál sería la función?

Gracias, saludos.
  #4 (permalink)  
Antiguo 12/05/2015, 15:02
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Sumar tiempos en foreach()

Yo estoy hablando de funciones de SQL, al momento de ahcer la consutla que mencionas en la base de datos.
Los DBMS tienen capacidades para hacer esa tarea a medida que obtienen los datos que consutlas. No hace falta implementar en PHP algo que puedes obtener de esa forma, en especial de acuerdo a la descripcion que haces:
Cita:
necesito sumar tiempos que vienen de una base de datos
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 12/05/2015, 16:05
 
Fecha de Ingreso: septiembre-2013
Ubicación: Madrid
Mensajes: 59
Antigüedad: 10 años, 7 meses
Puntos: 6
Respuesta: Sumar tiempos en foreach()

¿Y eso cómo lo hago? Por lo que he visto es igual que en PHP con el date_diff pero lo he probado y no sé como usarlo.
  #6 (permalink)  
Antiguo 12/05/2015, 16:21
Avatar de Nopal_Studio  
Fecha de Ingreso: julio-2012
Ubicación: DF
Mensajes: 42
Antigüedad: 11 años, 9 meses
Puntos: 10
Respuesta: Sumar tiempos en foreach()

$tiempo = new DateTime();
$tiempo->format('H:i A');

foreach($datos_tiempo AS $dato_tiempo)
{
echo $tiempo->add(new DateInterval('PT'.$dato_tiempo.'M'))->format('H:i A');
}

Ojo: Estoy pensando que vas agregar Minutos, por eso dice: 'PT'.$dato_tiempo.'M'
Si queires agregar horas pues le pones H en lugar de M
  #7 (permalink)  
Antiguo 12/05/2015, 17:11
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Sumar tiempos en foreach()

Cita:
Iniciado por chivacker Ver Mensaje
¿Y eso cómo lo hago? Por lo que he visto es igual que en PHP con el date_diff pero lo he probado y no sé como usarlo.
Nop. No es igual que en PHP. No es lo mismo usar PHP que SQL, como tampoco son iguales las funciones de fecha y hora en SQL Server, Oracle, MySQL, PostgreSQL, etc.
Pero con la poca información que das, se hace difícil darte un ejemplo.
¿Que DBMS (base de datos) usas, y cual es el tipo de columna de la tabla donde obtienes ese dato?
De acuerdo al DBMS, será la función que haya que usar, hay diferencias sustanciales.

¿Podrás al menos mostrarnos la consutla que haces, y un ejemplo de datos de horas que obtienes con ella?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 13/05/2015, 09:05
 
Fecha de Ingreso: septiembre-2013
Ubicación: Madrid
Mensajes: 59
Antigüedad: 10 años, 7 meses
Puntos: 6
Respuesta: Sumar tiempos en foreach()

Hola,

Gracias a los 2 por vuestras soluciones. Al final he tenido que hacer una función que convierta los segundos a 'H:i:s' y pasarle los segundos que vienen de MySQL con SUM(TIME_TO_SEC(tiempo)).

La consulta en MySQL ha sido
Código PHP:
Ver original
  1. $query = "SELECT SUM(TIME_TO_SEC(tiempo)) FROM 'prefijo_tiempos' WHERE id_usuario IN $array";
  2. // Array viene de otra petición que me da en una matriz los id de todos los usuarios de los que necesito tiempo

Por si a alguien le sirve la función os la dejo, aunque es básica de pasar segundos a H:i:s

Código PHP:
Ver original
  1. function segundos_a_hora($t){
  2.     $tiempo = (int) $t;
  3.     $segundos = $tiempo%60;
  4.     $sobra = floor($tiempo/60);
  5.     $minutos = $sobra%60;
  6.     $horas = floor($sobra/60);
  7.    
  8.     return "$horas:$minutos:$segundos";
  9. }

Muchas gracias a los dos, de nuevo, pero no consigo hacerme con el manejo de fechas nativos de PHP

Última edición por chivacker; 13/05/2015 a las 09:16
  #9 (permalink)  
Antiguo 13/05/2015, 10:27
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Sumar tiempos en foreach()

Técnicamente, deberías usar otra función más anidando:
Código MySQL:
Ver original
  1. FROM 'prefijo_tiempos'
  2. WHERE id_usuario IN $array
El único problema es que no puede representarte más de 823 horas sumadas, por lo que en una ocasión tuve que crear una stored function para resolverlo.
Si encuentro el código, esta noche te lo posteo, y de esa forma pudes dejar todo el problema en la base.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 13/05/2015, 17:07
 
Fecha de Ingreso: septiembre-2013
Ubicación: Madrid
Mensajes: 59
Antigüedad: 10 años, 7 meses
Puntos: 6
Respuesta: Sumar tiempos en foreach()

Hola, sí, lo probé y pensaba que era un fallo de precisión porque las horas sumadas en mi función me daban 1150:25:30 y cuando ponía el SEC_TO_TIME(SUM(TIME_TO_SEC())) se iba a las 823h y no sabía porqué así que recurrí a la función pero si sabes la solución para ahorrar tiempo de procesamiento y hacerlo en menos llamadas a funciones perfecto.

Muchas gracias :)

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:42.