Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Agrupar por dia y sumar

Estas en el tema de Agrupar por dia y sumar en el foro de PHP en Foros del Web. Buenas tardes, tengo una tabla de vacaciones de empleados, con los campos, id, fecha_inicio(date), fecha_fin(date) Necesitaría que, dado un lapso de tiempo , generar una ...
  #1 (permalink)  
Antiguo 09/09/2015, 14:41
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 16 años, 9 meses
Puntos: 194
Agrupar por dia y sumar

Buenas tardes,

tengo una tabla de vacaciones de empleados, con los campos, id, fecha_inicio(date), fecha_fin(date)

Necesitaría que, dado un lapso de tiempo, generar una agrupación por día de la cantidad de empleados que se estan tomando vacaciones .

Ejemplo:
Tabla vacaciones (mysql)
id:5, fecha_inicio:2015/02/22, fecha_fin:2015/02/26
id:6, fecha_inicio:2015/02/18, fecha_fin:2015/02/24

Datos de formulario
2015/02/15 a 2015/02/28

Resultado esperado:
2015/02/15:0
2015/02/16:0
2015/02/17:0
2015/02/18:1
2015/02/19:1
2015/02/20:1
2015/02/21:1
2015/02/22:2
2015/02/23:2
2015/02/24:2
2015/02/25:1
2015/02/26:1
2015/02/27:0
2015/02/28:0

Lo ideal seria poder resolverlo solamente en una consulta, pero no logro encontrarle la vuelta. Cualquier ayuda/sugerencia es bien recibida. Saludos
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #2 (permalink)  
Antiguo 09/09/2015, 15:54
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.448
Antigüedad: 8 años, 10 meses
Puntos: 263
Respuesta: Agrupar por dia y sumar

asi amigo:
Código PHP:
Ver original
  1. <?php
  2.  
  3. $fechaini = "2015-09-01";
  4. $fechafin = date("Y-m-d");
  5.  
  6. $resultado = $db->query("SELECT COUNT(fecha) as fech,fecha FROM fechas WHERE fecha BETWEEN '$fechaini' AND '$fechafin' GROUP BY DAY(fecha)");
  7. $linea = mysqli_num_rows($resultado);
  8.  
  9.     echo "<ul>";
  10. while($row = $resultado->fetch_array())
  11. {
  12.     echo "<li>El: <b>".date("d-m-Y", strtotime($row['fecha']))."</b> Salen de Vacaciones: <b>".$row['fech']."</b></li>";
  13.         }
  14. echo "</ul>";
  15. ?>

asi si quieres que se vean los trabajadores que salen en esas fechas:
Código PHP:
Ver original
  1. <?php
  2.  
  3. $fechaini = "2015-09-01";
  4. $fechafin = date("Y-m-d");
  5.  
  6. $resultado = $db->query("SELECT COUNT(fecha) as fech,fecha FROM fechas WHERE fecha BETWEEN '$fechaini' AND '$fechafin' GROUP BY DAY(fecha)");
  7. $linea = mysqli_num_rows($resultado);
  8.  
  9.     echo "<ul>";
  10. while($row = $resultado->fetch_array())
  11. {
  12.     echo "<li>El: <b>".date("d-m-Y", strtotime($row['fecha']))."</b> Salen de Vacaciones: <b>".$row['fech']."</b></li>";
  13.        
  14.         //Creamos una sub-lista con los nombres de trabajadores a salir ese dia
  15.         echo "<ul>";
  16.         //cargamos la fecha del primer while
  17.         $fecha = $row['fecha'];
  18.         //creamos una lista y separamos los valores de esa fecha
  19.         list($A, $m, $d) = explode("-", $fecha);
  20.         //consultamos los trabajadores a salir en esa fecha
  21.         $trabajador = $db->query("SELECT fecha,menu FROM fechas WHERE DAY(fecha) = '$d'");
  22.         //creamos la lista de trabajadores
  23.         while($row_traba = $trabajador->fetch_array()){    
  24.         echo "<li>".$row_traba['menu']."</li>";
  25.         }  
  26.             echo "</ul>";
  27.            
  28. }
  29. echo "</ul>";
  30. ?>

claro debe haber una formas mas sencilla, pero esta resulta bien. Saludos
__________________
[email protected]
HITCEL

Última edición por xfxstudios; 09/09/2015 a las 16:00
  #3 (permalink)  
Antiguo 09/09/2015, 16:15
 
Fecha de Ingreso: marzo-2015
Mensajes: 183
Antigüedad: 9 años, 1 mes
Puntos: 8
Respuesta: Agrupar por dia y sumar

A diferencia de xfxstudios, yo te entiendo de otra manera,
en la que solo tienes una tabla "vacaciones" y si bien es cierto el GROUP BY te permite agrupas registros, pero tú no tienes registros de n fechas almacenadas.
Por ello yo lo solucionaría de la siguiente manera.
Código PHP:
Ver original
  1. $aVacaciones[]=array('id'=>5,'fecha_inicio'=>'2015-02-22','fecha_fin'=>'2015-02-26');
  2. $aVacaciones[]=array('id'=>6,'fecha_inicio'=>'2015-02-18','fecha_fin'=>'2015-02-24');
  3.  
  4. $sFiltroFechaIni='2015-02-15';$sFiltroFechaFin='2015-02-28';
  5. $aGrupoFecha=array();
  6. $nFecha=0;
  7. for($nTime=strtotime($sFiltroFechaIni);$nTime<=strtotime($sFiltroFechaFin);$nTime=strtotime('+1 day'.date('Y-m-d',$nTime))){
  8.     //$aGrupoFecha[$nTime]
  9.     $aGrupoFecha[$nFecha]['time']=$nTime;
  10.     $aGrupoFecha[$nFecha]['count']=0;
  11.     foreach($aVacaciones as $row){//while($row=mysql_fetch_array($result)){
  12.         $sFechaIni=$row['fecha_inicio'];$sFechaFin=$row['fecha_fin'];
  13.         for($x_nTime=strtotime($sFechaIni);$x_nTime<=strtotime($sFechaFin);$x_nTime=strtotime('+1 day'.date('Y-m-d',$x_nTime))){
  14.             if($nTime==$x_nTime){
  15.                 $count=$aGrupoFecha[$nFecha]['count'];
  16.                 $count+=1;
  17.                 $aGrupoFecha[$nFecha]['count']=$count; 
  18.             }
  19.         }
  20.    
  21.     }
  22.     $nFecha++;
  23. }
  24.  
  25. foreach($aGrupoFecha as $row){//IMPRIME EL RESULTADO FINAL
  26.     echo date("Y-m-d",$row['time']).":".$row['count']."<br>";  
  27. }

Ya que estas usando datos de una tabla reemplaza el foreach que uso por el while que esta como comentario.
El query que deberías usar es "SELECT id,fecha_inicio,fecha_fin FROM vacaciones WHERE fecha_inicio>='$sFiltroFechaIni' AND fecha_inicio<='$sFiltroFechaFin'".
Es decir las variables que determinaran el rango de fechas a usar en la condicional.
Espero te sirva.

Última edición por oggy_15_3; 09/09/2015 a las 16:59
  #4 (permalink)  
Antiguo 10/09/2015, 10:29
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 16 años, 9 meses
Puntos: 194
Respuesta: Agrupar por dia y sumar

Muchas gracias xfxstudios y oggy_15_3

Tal como lo mencionas oggy, no tengo almacenadas N fechas, la solución que me planteas es la adecuada para mi problema.
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives

Etiquetas: agrupar, dia, fecha, formulario, mysql, tabla
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 16:04.