Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Generar array con datos de una consulta

Estas en el tema de Generar array con datos de una consulta en el foro de PHP en Foros del Web. Amigos: Genero una consulta a la base de datos y obtengo estos datos en $trabajos_array: nombre | fecha_ingreso | hora_ingreso | fecha_egreso | hora_egreso Los ...
  #1 (permalink)  
Antiguo 31/10/2014, 07:32
Avatar de armandoweb  
Fecha de Ingreso: enero-2003
Ubicación: San Cristobal, Santa Fe, Argentina
Mensajes: 544
Antigüedad: 21 años, 2 meses
Puntos: 7
Generar array con datos de una consulta

Amigos:
Genero una consulta a la base de datos y obtengo estos datos en $trabajos_array:

nombre | fecha_ingreso | hora_ingreso | fecha_egreso | hora_egreso

Los datos que extraigo son: nombre: nombre de la persona, fecha y hora ingreso: es el dia y hora que ingresa un trabajo, y fecha y hora egreso: fecha y hora que se termina.
El array que debo crear debería tener este formato:

Código PHP:
Ver original
  1. (
  2.     [0] => Array
  3.         (
  4.             [tecnico] => Pedro
  5.             [bien] => 15
  6.             [mal] => 2
  7.         )
  8.  
  9.     [1] => Array
  10.         (
  11.             [tecnico] => Juan
  12.             [bien] => 19
  13.             [mal] => 3
  14.         )
  15.  
  16.     [2] => Array
  17.         (
  18.             [tecnico] => Martin
  19.             [bien] => 18
  20.             [mal] => 5
  21.         )
  22.  
  23. )

Los datos a mostrar son: tecnico es el nombre de la persona, y bien y mal son los trabajos hechos que sobrepasan la media hora, es decir, si el trabajo hecho por Pedro por ejemplo es entregado antes de la media hora debe sumarse 1 a bien, de lo contrario se sumara 1 a mal.

Este es codigo que tengo hecho hasta el momento:

Código PHP:
Ver original
  1. $resultado = array();
  2. $nombres = array();
  3. $bien   = 0;
  4. $mal    = 0;
  5.  
  6. for($i = 0; $i < count($trabajos_array); $i++) {
  7.  
  8.         //aqui hago el calculo para saber si el
  9.         $date1 = new DateTime(date('Y-m-d', strtotime($trabajos_array[$i]['fecha_ingreso'])) . $trabajos_array[$i]['hora_ingreso']);
  10.         $date2 = new DateTime(date('Y-m-d', strtotime($trabajos_array[$i]['fecha_egreso '])) . $trabajos_array[$i]['hora_egreso']);
  11.         $interval = $date1->diff($date2);
  12.         $diferencia = $interval->format('%i');
  13.  
  14.         $nombres[] = $trabajos_array[$i]['nombre'];  
  15.  
  16.         if ($diferencia <= '30') {
  17.                    
  18.             $bien = $bien + 1;
  19.                
  20.     } else {
  21.                    
  22.         $mal = $mal + 1;
  23.                
  24.         }
  25.  
  26. }
  27.  
  28. //aqui armo el array de nombres unicos         
  29. $tecnicos = array();
  30. foreach ($nombres as $key => $val) {
  31.         if (!in_array($val, $tecnicos, true)) {
  32.         $tecnicos[] = $val;
  33.     }
  34. }
  35.  
  36. //aqui genero el array final
  37. for($i = 0; $i < count($tecnicos); $i++) {
  38.     $resultado[$i]['tecnico'] = $tecnicos[$i];
  39.     $resultado[$i]['bien'] = $bien;
  40.         $resultado[$i]['mal'] = $mal;
  41. }

Lo que me genera es último array es:

Código PHP:
Ver original
  1. (
  2.     [0] => Array
  3.         (
  4.             [tecnico] => Juan Uranda
  5.             [bien] => 3
  6.             [mal] => 0
  7.         )
  8.  
  9.     [1] => Array
  10.         (
  11.             [tecnico] => Martin Perez
  12.             [bien] => 3
  13.             [mal] => 0
  14.         )
  15.  
  16. )

Mi código falla en mostrar las cantidades de tareas de cada uno ya que el total es 3, Juan tiene hechas 2 tareas y Martin solo 1.

Como puedo modificar mi código para que me muestre correctamente las cantidades de trabajos de cada uno?

Desde ya muchas gracias por su ayuda!
__________________
www.awdesarrollos.com.ar - [twitter: @armandoweb] - [Skype: awdesarrollos"]
  #2 (permalink)  
Antiguo 31/10/2014, 07:54
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Generar array con datos de una consulta

Puedes modificar la tabla de esta forma

nombre
fecha_ingreso DATETIME YYYY-mm-dd HH:MM:SS
fecha_egreso DATETIME

Si fuera asi seria muy facil usando datetime funtions de mysql

Código MySQL:
Ver original
  1. SELECT nombre tecnico,
  2.     SUM(if(TIMEDIFF(fecha_egreso,fecha_ingreso)<'00:30:00',1,0)) bien,
  3.     SUM(if(TIMEDIFF(fecha_egreso,fecha_ingreso)<'00:30:00',0,1)) mal
  4. FROM tu_Tabla
  5. GROUP BY nombre;

De ahi al array que pides es muy facil.

Muestra que tipos de campos tienes quizas se podria solucionar combinando datetime functions....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 31/10/2014 a las 08:02
  #3 (permalink)  
Antiguo 31/10/2014, 10:06
Avatar de armandoweb  
Fecha de Ingreso: enero-2003
Ubicación: San Cristobal, Santa Fe, Argentina
Mensajes: 544
Antigüedad: 21 años, 2 meses
Puntos: 7
Respuesta: Generar array con datos de una consulta

Quimfv gracias por tu aporte...debería probarlo.

Los datos los tomo de 2 tablas, una tabla trabajos y una tabla tecnicos. De esta última solo el nombre del mismo y los demas datos de la tabla trabajos.

Generando esa consulta con los datos que necesito se me vería mucho mas simple y limpio el código.

Estoy trabajando con el framework LARAVEL, asi que probaré tu sugerencia y luego te digo como fue.

Gracias!
__________________
www.awdesarrollos.com.ar - [twitter: @armandoweb] - [Skype: awdesarrollos"]
  #4 (permalink)  
Antiguo 31/10/2014, 13:27
Avatar de armandoweb  
Fecha de Ingreso: enero-2003
Ubicación: San Cristobal, Santa Fe, Argentina
Mensajes: 544
Antigüedad: 21 años, 2 meses
Puntos: 7
Respuesta: Generar array con datos de una consulta

Quimfv no voy a poder modificar la base de datos, lo tendre que hacer desde el código...alguna idea de como modificar lo que ya tengo hecho?
Gracias!
__________________
www.awdesarrollos.com.ar - [twitter: @armandoweb] - [Skype: awdesarrollos"]
  #5 (permalink)  
Antiguo 31/10/2014, 14:08
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Generar array con datos de una consulta

postea el resultado de

SHOW CREATE TABLE tabla_trabajos

y veremos que se puede hacer.

No tiene ningun sentido que hagas eso por codigo, mysql lo resuelve mucho mejor.

nombre
fecha_ingreso DATE
hora_ingreso TIME
fecha_egreso DATE
hora_egreso TIME


Código MySQL:
Ver original
  1. SELECT tec.nombre tecnico,
  2.     SUM(if(TIMEDIFF(STR_TO_DATE(CONCAT(tra.fecha_egreso, ' ', tra.hora_egreso), '%Y-%m-%d %H:%i:%s'),
  3.                             STR_TO_DATE(CONCAT(tra.fecha_ingreso, ' ', tra.hora_ingreso), '%Y-%m-%d %H:%i:%s'))<'00:30:00',1,0)) bien,
  4.     SUM(if(TIMEDIFF(STR_TO_DATE(CONCAT(tra.fecha_egreso, ' ', tra.hora_egreso), '%Y-%m-%d %H:%i:%s'),
  5.                             STR_TO_DATE(CONCAT(tra.fecha_ingreso, ' ', tra.hora_ingreso), '%Y-%m-%d %H:%i:%s'))<'00:30:00',0,1)) mal
  6. FROM trabajos tra INNER JOIN tecnicos tec ON tra.idTecnicos=tec.idTecnicos
  7. GROUP BY tec.nombre;
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 31/10/2014 a las 14:23
  #6 (permalink)  
Antiguo 31/10/2014, 14:26
Avatar de armandoweb  
Fecha de Ingreso: enero-2003
Ubicación: San Cristobal, Santa Fe, Argentina
Mensajes: 544
Antigüedad: 21 años, 2 meses
Puntos: 7
Respuesta: Generar array con datos de una consulta

Esta es la consulta que hago:

Código PHP:
Ver original
  1. $trabajos = DB::table('trabajos')
  2.     ->join('tecnicos', 'trabajos.responsable_diagnostico', '=', 'tecnicos.id')
  3.     ->where('trabajos.created_at', '>=', $desde4, 'and', 'trabajos.created_at', '<=', $hasta4)
  4.     ->select('trabajos.fecha_ingreso', 'trabajos.hora_ingreso', 'tecnicos.nombre', 'trabajos.fecha_egreso', 'trabajos.hora_egreso')
  5.     ->get();

y este es el objeto que arroja:

Código PHP:
Ver original
  1. (
  2.     [0] => stdClass Object
  3.         (
  4.             [fecha_ingreso] => 10/10/2014
  5.             [hora_ingreso] => 12:30
  6.             [nombre] => Juan Uranda
  7.             [fecha_egreso] => 10/10/2014
  8.             [hora_egreso] => 12:50
  9.         )
  10.  
  11.     [1] => stdClass Object
  12.         (
  13.             [fecha_ingreso] => 16/10/2014
  14.             [hora_ingreso] => 12:30
  15.             [nombre] => Juan Uranda
  16.             [fecha_egreso] => 16/10/2014
  17.             [hora_egreso] => 13:00
  18.         )
  19.  
  20.     [2] => stdClass Object
  21.         (
  22.             [fecha_ingreso] => 31/10/2014
  23.             [hora_ingreso] => 12:30
  24.             [nombre] => Martin Perez
  25.             [fecha_egreso] => 31/10/2014
  26.             [hora_egreso] => 13:50
  27.         )
  28.  
  29. )

Eso es lo que necesitas saber?
__________________
www.awdesarrollos.com.ar - [twitter: @armandoweb] - [Skype: awdesarrollos"]
  #7 (permalink)  
Antiguo 31/10/2014, 20:56
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Generar array con datos de una consulta

Supongo que usas Laravel por la sintaxis que pusiste, la consulta de @quimfv pasada a Laravel seria algo asi:

Código PHP:
Ver original
  1. DB::table('trabajos')
  2.     ->join('tecnicos', 'trabajos.responsable_diagnostico', '=', 'tecnicos.id')
  3.     ->where('trabajos.created_at', '>=', $desde4, 'and', 'trabajos.created_at', '<=', $hasta4)
  4.     ->select(DB::raw('tecnicos.nombre tecnico,
  5.                         SUM(if(TIMEDIFF(STR_TO_DATE(CONCAT(trabajos.fecha_egreso, ' ', trabajos.hora_egreso), '%Y-%m-%d %H:%i:%s'),
  6.                            STR_TO_DATE(CONCAT(trabajos.fecha_ingreso, ' ', trabajos.hora_ingreso), '%Y-%m-%d %H:%i:%s'))<'00:30:00',1,0)) bien,
  7.                         SUM(if(TIMEDIFF(STR_TO_DATE(CONCAT(trabajos.fecha_egreso, ' ', trabajos.hora_egreso), '%Y-%m-%d %H:%i:%s'),
  8.                            STR_TO_DATE(CONCAT(trabajos.fecha_ingreso, ' ', trabajos.hora_ingreso), '%Y-%m-%d %H:%i:%s'))<'00:30:00',0,1)) mal'))
  9.     ->groupBy('tecnicos.nombre')
  10.     ->get();

No lo he probado, pero esa es la idea.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #8 (permalink)  
Antiguo 01/11/2014, 07:39
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Generar array con datos de una consulta

[fecha_egreso] => 10/10/2014
[hora_egreso] => 12:50

Ni las fechas ni las horas parecen tener formato DATE y TIME respectivamente

Cambia esto

STR_TO_DATE(CONCAT(trabajos.fecha_egreso, ' ', trabajos.hora_egreso), '%Y-%m-%d %H:%i:%s')

por esto

STR_TO_DATE(CONCAT(trabajos.fecha_egreso, ' ', trabajos.hora_egreso), '%d/%m/%Y %H:%i')

(en todas las apariciones)

a ver si funciona....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 04/11/2014 a las 02:56
  #9 (permalink)  
Antiguo 03/11/2014, 11:53
Avatar de armandoweb  
Fecha de Ingreso: enero-2003
Ubicación: San Cristobal, Santa Fe, Argentina
Mensajes: 544
Antigüedad: 21 años, 2 meses
Puntos: 7
Respuesta: Generar array con datos de una consulta

Hola NSD y Quimfv...
Luego de acomodar algunas comillas y colocar otras me quedó así:

Código PHP:
Ver original
  1. $trabajos = DB::table('trabajos')
  2.     ->join('tecnicos', 'trabajos.responsable_diagnostico', '=', 'tecnicos.id')
  3.     ->where('trabajos.created_at', '>=', $desde4, 'and', 'trabajos.created_at', '<=', $hasta4)
  4.     ->select(DB::raw('tecnicos.nombre',
  5.           SUM(if(TIMEDIFF(STR_TO_DATE(CONCAT('trabajos.fecha_egreso', ' ', 'trabajos.hora_egreso'), '%d/%m/%Y %H:%i'),
  6.                     STR_TO_DATE(CONCAT('trabajos.fecha_ingreso', ' ', 'trabajos.hora_ingreso'), '%d/%m/%Y %H:%i'))<'00:30:00',1,0) bien,
  7.               SUM(if(TIMEDIFF(STR_TO_DATE(CONCAT('trabajos.fecha_egreso', ' ', 'trabajos.hora_egreso'), '%d/%m/%Y %H:%i'),
  8.                     STR_TO_DATE(CONCAT('trabajos.fecha_ingreso', ' ', 'trabajos.hora_ingreso'), '%d/%m/%Y %H:%i'))<'00:30:00',0,1) mal))
  9.     ->groupBy('tecnicos.nombre')
  10.     ->get();

Pero esto me da un erro en el primer IF:

Código hh:
Ver original
  1. syntax error, unexpected 'if' (T_IF), expecting ')'

Por lo que dice falta un ) pero no puedo encontrar donde... :(
__________________
www.awdesarrollos.com.ar - [twitter: @armandoweb] - [Skype: awdesarrollos"]
  #10 (permalink)  
Antiguo 03/11/2014, 15:41
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Generar array con datos de una consulta

Te faltan las comillas de DB::Raw, ese método recibe un unico string con todo lo demas dentro, quimfv escribio la consulta en sql puro, lo que yo hice fue pasarlo a la sintaxis de laravel, el if que te da error no es un if de php, es un if de mysql por eso debe ir entre comillas. seria algo asi:
Código PHP:
Ver original
  1. <?php
  2. $trabajos = DB::table('trabajos')
  3.     ->join('tecnicos', 'trabajos.responsable_diagnostico', '=', 'tecnicos.id')
  4.     ->where('trabajos.created_at', '>=', $desde4, 'and', 'trabajos.created_at', '<=', $hasta4)
  5.     ->select(DB::raw("tecnicos.nombre,
  6.                SUM(if(TIMEDIFF(STR_TO_DATE(CONCAT('trabajos.fecha_egreso', ' ', 'trabajos.hora_egreso'), '%d/%m/%Y %H:%i'),
  7.                    STR_TO_DATE(CONCAT('trabajos.fecha_ingreso', ' ', 'trabajos.hora_ingreso'), '%d/%m/%Y %H:%i'))<'00:30:00',1,0) bien,
  8.                SUM(if(TIMEDIFF(STR_TO_DATE(CONCAT('trabajos.fecha_egreso', ' ', 'trabajos.hora_egreso'), '%d/%m/%Y %H:%i'),
  9.                    STR_TO_DATE(CONCAT('trabajos.fecha_ingreso', ' ', 'trabajos.hora_ingreso'), '%d/%m/%Y %H:%i'))<'00:30:00',0,1) mal)")
  10.             )
  11.     ->groupBy('tecnicos.nombre')
  12.     ->get();
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #11 (permalink)  
Antiguo 03/11/2014, 15:55
Avatar de armandoweb  
Fecha de Ingreso: enero-2003
Ubicación: San Cristobal, Santa Fe, Argentina
Mensajes: 544
Antigüedad: 21 años, 2 meses
Puntos: 7
Respuesta: Generar array con datos de una consulta

Si, faltaban esas comillas, me queda así:

Código PHP:
Ver original
  1. $trabajos = DB::table('trabajos')
  2.     ->join('tecnicos', 'trabajos.responsable_diagnostico', '=', 'tecnicos.id')
  3.     ->where('trabajos.created_at', '>=', $desde4, 'and', 'trabajos.created_at', '<=', $hasta4)
  4.     ->select(DB::raw("tecnicos.nombre,
  5.                SUM(if(TIMEDIFF(STR_TO_DATE(CONCAT('trabajos.fecha_egreso', ' ', 'trabajos.hora_egreso'), '%d/%m/%Y %H:%i'),
  6.                    STR_TO_DATE(CONCAT('trabajos.fecha_ingreso', ' ', 'trabajos.hora_ingreso'), '%d/%m/%Y %H:%i'))<'00:30:00',1,0) bien,
  7.                SUM(if(TIMEDIFF(STR_TO_DATE(CONCAT('trabajos.fecha_egreso', ' ', 'trabajos.hora_egreso'), '%d/%m/%Y %H:%i'),
  8.                    STR_TO_DATE(CONCAT('trabajos.fecha_ingreso', ' ', 'trabajos.hora_ingreso'), '%d/%m/%Y %H:%i'))<'00:30:00',0,1) mal)"))
  9.     ->groupBy('tecnicos.nombre')
  10.     ->get();

Pero ahora me da error en las comillas que encierran el espacio de la concatenación, probé de dejarlas así '" "' pero no es correcto...
__________________
www.awdesarrollos.com.ar - [twitter: @armandoweb] - [Skype: awdesarrollos"]
  #12 (permalink)  
Antiguo 03/11/2014, 16:18
Avatar de armandoweb  
Fecha de Ingreso: enero-2003
Ubicación: San Cristobal, Santa Fe, Argentina
Mensajes: 544
Antigüedad: 21 años, 2 meses
Puntos: 7
Respuesta: Generar array con datos de una consulta

Así queda el código, ya funciona perfectamente!

Código PHP:
Ver original
  1. $trabajos = DB::table('trabajos')
  2.     ->join('tecnicos', 'trabajos.responsable_diagnostico', '=', 'tecnicos.id')
  3.     ->where('trabajos.created_at', '>=', $desde4)
  4.         ->where('trabajos.created_at', '<=', $hasta4)
  5.     ->select(DB::raw("tecnicos.nombre,
  6.             SUM(if(TIMEDIFF(STR_TO_DATE(CONCAT('trabajos.fecha_diag', ' ', 'trabajos.hora_diag'), '%d/%m/%Y %H:%i'),
  7.         STR_TO_DATE(CONCAT('trabajos.fecha_ingreso', ' ', 'trabajos.hora_ingreso'), '%d/%m/%Y %H:%i'))<'00:30:00',1,0)) as bien,
  8.         SUM(if(TIMEDIFF(STR_TO_DATE(CONCAT('trabajos.fecha_diag', ' ', 'trabajos.hora_diag'), '%d/%m/%Y %H:%i'),
  9.         STR_TO_DATE(CONCAT('trabajos.fecha_ingreso', ' ', 'trabajos.hora_ingreso'), '%d/%m/%Y %H:%i'))<'00:30:00',0,1)) as mal"))
  10.     ->groupBy('tecnicos.nombre')
  11.     ->get();

Muchas gracias NSD y Quimfv por su tiempo, han sido de mucha ayuda!
Saludos!
__________________
www.awdesarrollos.com.ar - [twitter: @armandoweb] - [Skype: awdesarrollos"]

Etiquetas: fecha
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 00:26.