Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

calcular filas de dos select distintos

Estas en el tema de calcular filas de dos select distintos en el foro de Mysql en Foros del Web. Hola, soy nuevo en el foro. Estoy haciendo una aplicacion para control horario. Tengo un campo DateTime en una base de datos mysql 3.5, que ...
  #1 (permalink)  
Antiguo 03/05/2009, 03:30
 
Fecha de Ingreso: mayo-2009
Mensajes: 5
Antigüedad: 14 años, 11 meses
Puntos: 0
calcular filas de dos select distintos

Hola, soy nuevo en el foro.

Estoy haciendo una aplicacion para control horario. Tengo un campo DateTime en una base de datos mysql 3.5, que me recoge las entradas y salidas. He probado de hacer dos select, uno que me da las entradas y otro las salidas. Ahora queria sacar la diferencia (no diferencia total) de horas de entradas y salidas intermedias. Es decir: entra 08:00 sale 09:00 entra 09:10 sale 10:30, etc

He montado dos consultas que en la misma fila de la tabla me da la entra y la salida, pues quería, en la columna siguiente obtener el calculo del tiempo transcurrido.

Me encuentro con el problema de capturar fila a fila las consultas.

Quizas hay otro modo mejor de hacerlo

Un saludo
  #2 (permalink)  
Antiguo 03/05/2009, 07:04
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: calcular filas de dos select distintos

Que tal pautex.

Podrías describir que haz hecho hasta el momento? Como haces las consultas?
En un ejemplo mostrarnos cual es la salida que quieres?

Por que tienes una versión tan vieja de mysql?

Revisa la función timediff de mysql.

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Última edición por huesos52; 03/05/2009 a las 07:11
  #3 (permalink)  
Antiguo 03/05/2009, 14:40
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: calcular filas de dos select distintos

Debes darnos más datos, como pide el amigo huesos52, pero si has guardado fecha-hora de entrada y fecha-hora de salida en un mismo campo y marcado con otro campo o no (tal vez no sería necesario) la salida, te bastaría con agrupar por DATE_FORMAT(). Una consulta así te mostraría la hora de entrada y salida si sólo hay una el mismo día y las dos ocurren en el mismo día:

SELECT campotrabajador, DATE_FORMAT(campofecha,'%Y-%m-%d')dia, MIN(campofecha) entrada, MAX(campofecha)salida FROM nombretabla GROUP BY DATE_FORMAT(campofecha,'%Y-%m-%d'), campotrabajador

Luego veremos qué usar para mostrar sólo la hora en tu versión. Creo que la función de cadena substring -8 podría servir en tu versión

Código sql:
Ver original
  1. campotrabajador, SELECT DATE_FORMAT(campofecha,'%Y-%m-%d')dia, SUBSTRING(MIN(campofecha),-8) entrada, SUBSTRING(MAX(campofecha),-8)salida
  2.  FROM palabras GROUP BY DATE_FORMAT(campofecha,'%Y-%m-%d'), campotrabajador

No obstante, te diré que esto puede llevarte a error, pues no nos dices cómo marcas las entradas y salidas, si con E/S o simplemente piensas que te bastará con la diferencia horaria. Por otra parte, tampoco dices si en el mismo día podría haber varias entradas y salidas, lo que impediría usar esta consulta con garantía, igual que si entras un día y sales el siguiente.
Respecto a las diferencias, con una versión tan antigua tendrás que recurrir a UNIX_TIME
con algo así conseguirás los segundos:
SELECT campotrabajador, DATE_FORMAT(campofecha,'%Y-%m-%d')dia, SUBSTRING(MIN(campofecha),-8) entrada, substring(MAX(campofecha),-8)salida, (unix_timestamp(max(campofecha))- unix_timestamp(min(campofecha)))diferencia FROM palabras GROUP BY DATE_FORMAT(campofecha,'%Y-%m-%d'), campotrabajador

campotrabajador es el campo que te sirve para indicar el trabajador

Luego con FLOOR y MOD sacaremos la diferencia en un formato time.

Ah, y el mejor consejo de todos; si la versión de MySQL depende de ti, y no sólo del servidor, actualiza a una versión posterior a 4.1. Comprueba que versión usa tu servidor, porque lo mismo es más reciente y tú puedes actualizar la tuya y usar funciones como timediff, la recomendada por huesos52. Bastará con ella y te evitarás unix_timestamp, floor, mod, etc. (la diferencia no es poca, ¿verdad?)

Última edición por jurena; 04/05/2009 a las 01:11
  #4 (permalink)  
Antiguo 04/05/2009, 07:08
 
Fecha de Ingreso: mayo-2009
Mensajes: 5
Antigüedad: 14 años, 11 meses
Puntos: 0
Respuesta: calcular filas de dos select distintos

Hola, gracias por responder. Explico lo que tengo hasta ahora

La tabla que recoge la informacion tiene un campo "DateTime" (recoge la hora), otro "TransType" (27 = entradas; 28 = salidas).

La base de datos (MySql ver 3.50) no me es posible actualizarla, ya que me llevaria mucho tiempo el actualizar tambien todo lo que tengo programado hasta ahora. Se que es lo mejor...

He creado una consulta con Max y Min y calculo el total de tiempo transcurrido.

El problema es que puede haber muchas entradas y salidas intermedias y, al tener la hora en un sólo campo, junto con las limitaciones de esta version de bbdd, no puedo hacer ningun cursor, ni dateDiff, etc. Lo tengo que sacar con php.

He creado una tabla tmp con los datos de salidas y al hacer un select con un join, me duplica las filas. Al final he optado por hacer dos select (entradas y salidas). Con una tabla uno las filas ya que son pares (la entrada con su respectiva salida). Querría en una tercera columna aplicar una funcion (que he creado para calcular la diferencia de horas y minutos) que me diese el resultado. Para ello tengo que recorrer las filas de cada select y que me las calcule en dicha columna.

Habia pensado, tambien, unir las dos consultas en un tercer array. Pero no he conseguido aclararme (me sale el bucle de la funcion, pero no aplica el resultado a los valores de los dos array o consulta)


Muchas gracias
  #5 (permalink)  
Antiguo 04/05/2009, 09:25
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: calcular filas de dos select distintos

Ponnos un ejemplo con datos para que veamos cómo los introduces. Por ejemplo, cómo guardas cuando un usarurio entra y sale en un mismo día. Dices que guardas la hora(hora, minuto y segundo), pero imagino que guardas el día también(año, mes y día). Muestra la tabla con los campos y sus tipos, así como los ejemplos de los datos que introduces. Aclara algo más lo de las salidas intermedias (¿del mismo trabajador en el mismo día?). Aquí sólo podemos ayudarte con sintaxis SQL y funciones de MySQL, es decir, con lo que puedas hacer con la base de datos.
Si algo no puede conseguirse, te remitiremos al foro PHP.
  #6 (permalink)  
Antiguo 05/05/2009, 06:44
 
Fecha de Ingreso: mayo-2009
Mensajes: 5
Antigüedad: 14 años, 11 meses
Puntos: 0
Respuesta: calcular filas de dos select distintos

Hola,

La consuta que me da los resultados es la siguiente:

SELECT
maintrans.OperNo,
maintrans.AccountDate, = fecha cantable
Date_Format(DateTime`, '%H:%m') AS Horas
FROM
maintrans
WHERE
TransType Between 27 and 28 = 27 entrada, 28 salida



ENTRADAS SALIDAS TOTAL
19:53:48 22:20:15 22:04:12 08:22:17
  #7 (permalink)  
Antiguo 05/05/2009, 06:57
 
Fecha de Ingreso: mayo-2009
Mensajes: 5
Antigüedad: 14 años, 11 meses
Puntos: 0
Respuesta: calcular filas de dos select distintos

Perdonad le he dado enviar sin querer y no estaba completo


La consuta que me da los resultados es la siguiente:

SELECT
maintrans.OperNo,
maintrans.AccountDate, = fecha cantable
Date_Format(DateTime`, '%H:%m') AS Horas
FROM
maintrans
WHERE
TransType Between 27 and 28 = 27 entrada, 28 salida



Oper HORAS TransType
1 13:00 27
1 14:00 28
1 16:30 27
1 17:00 28
1 19:53 27
1 21:30 28
1 22:04 27
1 23:22 28

Con php tengo un formulario de busqueda por fecha (AccountDate) y me devuelve los movimientos de ese día. (Tambien puedo añadir el operario).

He creado una tabla tmp con los datos filtrados por salidas. Después, con un select, uno las dos tablas, pero me duplica los datos.

También he puesto los dos select (filtrado por solo entradas y el otro salidas en dos columnas y queria en una tercera hacer el calculo de la fila, ya que siempre seran pares (entrada/salida) pero no lo he conseguido.

Con una funcion calculo las horas transcurridas.

Mi idea era pasar los select a un array cada uno y a traves de los indices poder calcular en un tercer array los respectivos campos. Quizas haya otro modo mejor.


Muchas gracias por vuestra ayuda.
  #8 (permalink)  
Antiguo 05/05/2009, 09:39
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: calcular filas de dos select distintos

Te diré cuál es el problema que veo, averiguar cuál es la salida de cada entrada y viceversa.
Tú tienes y, por lo que dices, un campo para la fecha, pero no sé si tienes un id en esa tabla y si podría servirnos para reunir la entrada con su salida, o no es así; porque si no hubiera modo de distinguirlo, te va a ser difícil. Cómo se almacenan, en qué orden, siempre van seguidos la entrada y la salida, cuántos registros puede haber entre ellos. Sólo en el caso de que pudiéramos usar algo como referencia (si sólo fuera una entrada-salida al día) podríamos controlarlo. De hecho la mejor opción quizás hubiera sido en este caso Oper, horaentrada, horasalida. Otra opción es marcar con algo esa referencia, algo así como un número de movimiento. Acláranos un poco más lo que podemos usar para reunir una entrada con su salida (si se trata del orden en el que están almacenadas, yo te diría que recurrieses a programación, como dices estar haciendo). Pero eso debes consultarlo en el foro de programación.
  #9 (permalink)  
Antiguo 05/05/2009, 23:17
 
Fecha de Ingreso: mayo-2009
Mensajes: 5
Antigüedad: 14 años, 11 meses
Puntos: 0
Respuesta: calcular filas de dos select distintos

Hola gracias por responder.

Quizas podría hacer lo siguiente:

Tengo un campo en la misma tabla "InOutReason" que le puedo asignar el valor que quiera ( 10 entrada 1ª, 11 ausencia, 12 retorno y 13 fin de día.

El operario se identifiaría con su número respectivo y despues pulsaria sobre el boton que corresponda.

Quizas con estas combinaciones puede valer.


Yo habia pensado pasar las consultas a un array ya que éste si monta el indice de registros. No he sabido unirlos...

Tambien tengo la opcion de crear una tabla temporal que me actulizase de algun modo los datos de esta otras. Pero en esto algo algo perdido, sobre todo por la limitacion de la BBDD.

Si se os ocurre alguna solucion alternativa os lo agradezco

un saludo
  #10 (permalink)  
Antiguo 06/05/2009, 18:46
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: calcular filas de dos select distintos

Con esas posibilidades únicamente, no creo, porque sólo tienes para entrada primera, fin de día, ausencia y retorno. ¿Qué ocurriría si se ausenta y retorna más de una vez al día, por ejemplo 3 veces? Si permites numerar de manera indefinida e incluyes 1,2,3, etc. para cada entrada-salida de un mismo usuario, sí. Yo creo que debías haber ido por la vía que te propuse de usuario,numaccion, fecha, horaentrada, horasalida en un mismo registro. Si no es así y tampoco te interesa ampliar los números del campo del que te hablé al principio, puedes controlar algo con los id, pues el un número de id anterior, con 27 de un usuario en un día, y el posterior de ese mismo usuario ese mismo día con 28, serían entrada y salida. Te tocará trabajar con programación para cargar eso en un array y trabajar en el array o cargarlo en una tabla virtual, realizar las operaciones y volver a mostrar los resultados. En cualquier caso, requiere, creo, de programación para poner en relación una entrada con la salida correspondiente, y eso te ayudarán a hacerlo en el foro de tu programa. No obstante, lo veo algo más complejo. La otra opción la agrupación por usuario, dia, esenumero te permitiría separar la hora de entrada y salida y hacer los cálculos.

Última edición por jurena; 06/05/2009 a las 18:52
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 19:33.