Ver Mensaje Individual
  #11 (permalink)  
Antiguo 18/10/2009, 19:39
Avatar de gnzsoloyo
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: 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)