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

sacar el datediff en un selec

Estas en el tema de sacar el datediff en un selec en el foro de Mysql en Foros del Web. Tengo este selec SELECT * FROM incidencias, salon, empleados WHERE resuelta = 'Y' AND insalon=id_salon AND nombre = id_empleados ORDER BY id_incidencias DESC Esta consulta ...
  #1 (permalink)  
Antiguo 11/10/2009, 09:09
 
Fecha de Ingreso: febrero-2008
Mensajes: 675
Antigüedad: 16 años, 2 meses
Puntos: 5
sacar el datediff en un selec

Tengo este selec
SELECT *
FROM incidencias, salon, empleados
WHERE resuelta = 'Y' AND insalon=id_salon AND nombre = id_empleados
ORDER BY id_incidencias DESC
Esta consulta tiene 2 campos "fecha" y "in_fecha" en esta consulta quiero sacar tambien la diferencia en dias y horas de esos 2 campos que son DATETIME. cual es el codigo para que me de el resultado sin tener que hacer otra consulta? Y si tubiera que hacer otra consulta, como sería para que supiera a que dato se esta refiriendo de la tabla?
Un saludo
  #2 (permalink)  
Antiguo 11/10/2009, 10:11
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: sacar el datediff en un selec

Código sql:
Ver original
  1. SELECT *,datediff(incidencias.fecha,incidencias.infecha) diferencia
  2. FROM incidencias, salon, empleados
  3. WHERE resuelta = 'Y' AND insalon=id_salon AND nombre = id_empleados
  4. ORDER BY id_incidencias DESC

así?
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 12/10/2009, 10:47
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: sacar el datediff en un selec

Perdón, creí ver que faltaba una relación entre tablas, pero todo parece estar bien, aunque yo usaría INNER JOIN, excepto para el WHERE resuelta = 'Y'
  #4 (permalink)  
Antiguo 16/10/2009, 09:58
 
Fecha de Ingreso: febrero-2008
Mensajes: 675
Antigüedad: 16 años, 2 meses
Puntos: 5
Respuesta: sacar el datediff en un selec

Me puedes explicar eso del inner join? y donde lo pondrias y sobre todo el por que?.
tambien me gustaria sacar en el datediff los dias y horas separados. un saludo y gracias
  #5 (permalink)  
Antiguo 16/10/2009, 10:47
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: sacar el datediff en un selec

mira este post ahÍ puedes despejar las dudas y cual es la diferencia entre anidar tablas en el where Y COMO ANIDAR TABLAS HACIENDO USO DE INNER JOIN.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #6 (permalink)  
Antiguo 18/10/2009, 03:57
 
Fecha de Ingreso: febrero-2008
Mensajes: 675
Antigüedad: 16 años, 2 meses
Puntos: 5
Respuesta: sacar el datediff en un selec

No sabia que fuiera mas eficaz el inner JOIN, pero me falta otra cosa por conocer... como puedo separar los dias y horas y que me las imprima por separado?.

Un saludo
  #7 (permalink)  
Antiguo 18/10/2009, 08:09
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: sacar el datediff en un selec

con las funciones day y month.

Código mysql:
Ver original
  1. mysql> use pruebas
  2. Database changed
  3. mysql> select day(now()) dia,month(now()) mes;
  4. +------+------+
  5. | dia  | mes  |
  6. +------+------+
  7. |   18 |   10 |
  8. +------+------+
  9. 1 row in set (0.07 sec)
  10.  
  11. mysql>
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #8 (permalink)  
Antiguo 18/10/2009, 13:01
 
Fecha de Ingreso: febrero-2008
Mensajes: 675
Antigüedad: 16 años, 2 meses
Puntos: 5
Respuesta: sacar el datediff en un selec

Lo que me gustaria es separar los dias y las horas, por ejemplo, cuanto tiempo a transcurrido desde el campo "fecha" hasta el campo "in_fecha" en dias y horas.
Sería una cosa así.
2 dias 7 horas 20 minutos.
este es el codigo que tengo actualmente

SELECT *,datediff(incidencias.fecha,incidencias.infecha) diferencia
FROM incidencias, salon, empleados
WHERE resuelta = 'Y' AND insalon=id_salon AND nombre = id_empleados
ORDER BY id_incidencias DESC

Gracias
  #9 (permalink)  
Antiguo 18/10/2009, 13:23
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: sacar el datediff en un selec

Aunque este post sea de oracle
http://www.forosdelweb.com/f100/como...a-edad-720984/

es una función que dice el tiempo transcurrido en años, meses y dias.

Para reemplazar la función months_between de oracle utiliza en mysql la función timestampdiff que explica jurena en este post.
http://www.forosdelweb.com/f86/saber...ta-hoy-736710/
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #10 (permalink)  
Antiguo 18/10/2009, 18:53
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: sacar el datediff en un selec

Yo lo haría con timestampdiff y luego convertiría a segundos; posteriormente mediante el uso de floor, mod, y para el caso de minutos y segundos MINUTE y SECOND, mostraría los datos.

SELECT floor(Hour(sec_to_time(TIMESTAMPDIFF(SECOND,'2007-12-30 11:23:24','2007-12-31 23:59:59')))/24) días,Mod(Hour(sec_to_time(TIMESTAMPDIFF(SECOND,'20 07-12-30 11:23:24','2007-12-31 23:59:59'))),24) horas, Minute(sec_to_time(TIMESTAMPDIFF(SECOND,'2007-12-30 11:23:24','2007-12-31 23:59:59'))) minutos, second(sec_to_time(TIMESTAMPDIFF(SECOND,'2007-12-30 11:23:24','2007-12-31 23:59:59'))) segundos

Saludos para ti, visona, y para Daniel.
  #11 (permalink)  
Antiguo 18/10/2009, 19:39
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, 4 meses
Puntos: 2658
Respuesta: sacar el datediff en un selec

Yo propondría una solución en dos partes: Primero recuperar la diferencia de tiempo con TIMESTAMDIFF(), tal y como proponen todo, pero implementar la salida de la cadena final por medio de una Stored Function, de modo de tener un código más limpio y comprensible:

Código sql:
Ver original
  1. SELECT FN_DEVOLVERTIEMPO(TIMESTAMPDIFF(SECOND, '2007-12-30 11:23:24', '2007-12-31 23:59:59'));

Función:
Código sql:
Ver original
  1. DELIMITER $$
  2.  
  3. DROP FUNCTION IF EXISTS `FN_DEVOLVERTIEMPO` $$
  4. CREATE FUNCTION `FN_DEVOLVERTIEMPO`(TOTALSEG INT) RETURNS CHAR(32) CHARSET latin1
  5.     READS SQL DATA
  6. BEGIN
  7.  DECLARE TIEMPO CHAR(32);
  8.  DECLARE DIA INT DEFAULT 0;
  9.  DECLARE HORA INT DEFAULT 0;
  10.  DECLARE MINUTO INT DEFAULT 0;
  11.  DECLARE SEGUNDO INT DEFAULT 0;
  12.  SET DIA= TOTALSEG DIV 86400;
  13.  SET TOTALSEG = TOTALSEG % 86400;
  14.  SET HORA= TOTALSEG DIV 3600;
  15.  SET TOTALSEG = TOTALSEG % 3600;
  16.  SET MINUTO = TOTALSEG DIV 60;
  17.  SET SEGUNDO= TOTALSEG % 60;
  18.  SET TIEMPO=CONCAT(DIA, ' D. ', HORA, ' hs. ', MINUTO,' min. ', SEGUNDO,' seg.');
  19.  RETURN TIEMPO;
  20.  END $$
  21.  
  22. DELIMITER ;

La función tiene una redacción poco eficiente pero cumple su cometido: entrega un string con la representación completa en una cadena (tiene esa forma porque la aplicación en que se usa requiere que la salida sea así).

Si se requiere que los valores vuelvan por separado, habría que darle forma de Stored Procedure:
Código SQL:
Ver original
  1. DELIMITER $$
  2.  
  3. DROP PROCEDURE IF EXISTS `SP_DEVOLVERTIEMPO` $$
  4. CREATE PROCEDURE `SP_DEVOLVERTIEMPO`(
  5.   IN TOTALSEG INT,
  6.   OUT DIA INT,
  7.   OUT HORA INT,
  8.   OUT MINUTO INT
  9.   OUT SEGUNDO INT
  10.    ) RETURNS CHAR(32) CHARSET latin1
  11.     READS SQL DATA
  12. BEGIN
  13.  SET DIA= TOTALSEG DIV 86400;
  14.  SET TOTALSEG = TOTALSEG % 86400;
  15.  SET HORA= TOTALSEG DIV 3600;
  16.  SET TOTALSEG = TOTALSEG % 3600;
  17.  SET MINUTO = TOTALSEG DIV 60;
  18.  SET SEGUNDO= TOTALSEG % 60;
  19. END $$
  20.  
  21. DELIMITER ;
En ese caso, habría que llamarla por CALL y recoger la salida en sendas variables.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
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 02:50.