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

[APORTE] Calcular tiempo transcurrido entre dos fechas, obtener X AÑOS X MESES X DIAS

Estas en el tema de [APORTE] Calcular tiempo transcurrido entre dos fechas, obtener X AÑOS X MESES X DIAS en el foro de Mysql en Foros del Web. Saludos mis estimados, ayer tuve la necesidad de calcular el tiempo transcurrido entre dos fechas, pero el resultado debería ser Han transcurrido XX Años, XX ...
  #1 (permalink)  
Antiguo 19/10/2011, 14:37
Avatar de djcandido  
Fecha de Ingreso: junio-2009
Ubicación: San Salvador
Mensajes: 50
Antigüedad: 15 años, 5 meses
Puntos: 0
Información [APORTE] Calcular tiempo transcurrido entre dos fechas, obtener X AÑOS X MESES X DIAS

Saludos mis estimados, ayer tuve la necesidad de calcular el tiempo transcurrido entre dos fechas, pero el resultado debería ser Han transcurrido XX Años, XX Meses, XX Dias.

Con esto el usuario podrá la desicion de ejecutar cualquier otra funcion del sistema en desarrollo.

Para ello me valgo de cuatro funciones de mysql:

TIMESTAMPDIFF
DATEDIFF
CURDATE
DATE_ADD

La sentencia es la siguiente:

Código:
SELECT
(SELECT TIMESTAMPDIFF(YEAR,'2010-06-01',CURDATE()))  AS ANIOS,
(SELECT (TIMESTAMPDIFF(MONTH,'2010-06-01',CURDATE())) - (TIMESTAMPDIFF(YEAR,'2010-06-01',CURDATE()) * 12)) AS MESES,
(SELECT DATEDIFF(CURDATE(),DATE_ADD(DATE_ADD('2010-06-01', INTERVAL TIMESTAMPDIFF(YEAR,'2010-06-01',CURDATE()) YEAR), INTERVAL (TIMESTAMPDIFF(MONTH,'2010-06-01',CURDATE())) - (TIMESTAMPDIFF(YEAR,'2010-06-01',CURDATE()) * 12) MONTH))) AS DIAS
Trataré de Explicarla:

Código:
(SELECT TIMESTAMPDIFF(YEAR,'2010-06-01',CURDATE()))  AS ANIOS
Este select me obtiene la cantidad de años que han transcurrido desde una fecha hasta el dia de hoy.

Código:
(SELECT (TIMESTAMPDIFF(MONTH,'2010-06-01',CURDATE())) - (TIMESTAMPDIFF(YEAR,'2010-06-01',CURDATE()) * 12)) AS MESES
Con este select obtengo los meses que han pasado para ello le resto el total de meses, para el ejemplo desde el dia 2010-06-01 hasta el dia 2011-10-19 han pasado 16 meses, a esos 16 meses le resto 12 meses que para entenderlo sería algo así:
Código:
16 - (TIMESTAMPDIFF(YEAR,'2010-06-01',CURDATE()) * 12))
Esto me indica que si hay 2 años transcurridos será una resta de 24 meses pero obviamente ya no serían 16 meses anteriores sino 28 meses.

Código:
(SELECT DATEDIFF(CURDATE(),DATE_ADD(DATE_ADD('2010-06-01', INTERVAL  TIMESTAMPDIFF(YEAR,'2010-06-01',CURDATE()) YEAR), INTERVAL  (TIMESTAMPDIFF(MONTH,'2010-06-01',CURDATE())) -  (TIMESTAMPDIFF(YEAR,'2010-06-01',CURDATE()) * 12) MONTH))) AS DIAS
Con esta sentencia obtengo los días transcurridos. para ello tengo que anidar la funcion DATE_ADD
Ejemplo:
DATE_ADD('2010-06-01' añadir 1 año) = 2011-06-01
a ese resultado añadir los meses resultantes ejemplo:
DATE_ADD('2011-06-01' añadir 4 meses) = 2011-10-01
Ahora necesitamos cuantos días hay desde el 2011-10-01 hasta el dia de hoy (osea el curdate()) para ello ocupo la funcion datediff() así:

DATEDIFF(CURDATE(),'2011-10-01') => Notar que la fecha 2011-10-01 se obtiene asi:
Código HTML:
DATE_ADD(DATE_ADD('2010-06-01', INTERVAL   TIMESTAMPDIFF(YEAR,'2010-06-01',CURDATE()) YEAR), INTERVAL   (TIMESTAMPDIFF(MONTH,'2010-06-01',CURDATE())) -   (TIMESTAMPDIFF(YEAR,'2010-06-01',CURDATE()) * 12) MONTH))
AL FINAL TODA LA SENTENCIA ES LA SIGUIENTE:
Código:
/*Inicio*/
SELECT
(SELECT TIMESTAMPDIFF(YEAR,'2009-06-01',CURDATE()))  AS ANIOS,
(SELECT (TIMESTAMPDIFF(MONTH,'2009-06-01',CURDATE())) - (TIMESTAMPDIFF(YEAR,'2009-06-01',CURDATE()) * 12)) AS MESES,
(SELECT DATEDIFF(CURDATE(),DATE_ADD(DATE_ADD('2009-06-01', INTERVAL TIMESTAMPDIFF(YEAR,'2009-06-01',CURDATE()) YEAR), INTERVAL (TIMESTAMPDIFF(MONTH,'2009-06-01',CURDATE())) - (TIMESTAMPDIFF(YEAR,'2009-06-01',CURDATE()) * 12) MONTH))) AS DIAS
/*Fin*/
Por favor, revisenla y si hay alguna falla, agredeceré que la publiquen tambien, pues este query es el que he colocado en mi aplicación.
  #2 (permalink)  
Antiguo 09/11/2011, 17:04
 
Fecha de Ingreso: septiembre-2011
Ubicación: Colombia
Mensajes: 17
Antigüedad: 13 años, 2 meses
Puntos: 2
Respuesta: [APORTE] Calcular tiempo transcurrido entre dos fechas, obtener X AÑOS X M

hola, porque no intentas hacer una funcion que te devuelva una cadena de esta forma "XX Años, XX Meses, XX Dias." utilizando las operaciones que mencionas ...
  #3 (permalink)  
Antiguo 09/11/2011, 17:26
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: [APORTE] Calcular tiempo transcurrido entre dos fechas, obtener X AÑOS X M

Trata de no complicar tanto los cálculos. Puedes tomar esto como base; lo hice hace algunos años para un desarrollo y todavía está en uso.
El objetivo era establecer cuánto tiempo había pasado entre dos fechas, tomando la diferencia en segundos entre ambas.
Código MySQL:
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.     DECLARE TIEMPO CHAR(32);
  6.     DECLARE DIA INT DEFAULT 0;
  7.     DECLARE HORA INT DEFAULT 0;
  8.     DECLARE MINUTO INT DEFAULT 0;
  9.     DECLARE SEGUNDO INT DEFAULT 0;
  10.     SET DIA= TOTALSEG DIV 86400;
  11.     SET TOTALSEG = TOTALSEG % 86400;
  12.     SET HORA= TOTALSEG DIV 3600;
  13.     SET TOTALSEG = TOTALSEG % 3600;
  14.     SET MINUTO = TOTALSEG DIV 60;
  15.     SET SEGUNDO= TOTALSEG % 60;
  16.     SET TIEMPO=CONCAT(DIA, ' D. ', HORA, ' hs. ', MINUTO,' min. ', SEGUNDO,' seg.');
  17.     RETURN TIEMPO;
  18. END $$
  19.  
  20. DELIMITER ;
Te dejo esta base para que tu resuelvas la parte de años y meses.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 10/11/2011, 07:31
Avatar de djcandido  
Fecha de Ingreso: junio-2009
Ubicación: San Salvador
Mensajes: 50
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: [APORTE] Calcular tiempo transcurrido entre dos fechas, obtener X AÑOS X M

Ok, señores, gracias a ustedes por su aporte tambien, la verdad es que no hice funcion por las siguientes razones.

1-Necesitaba la solucion en un tiempo muy corto, (justo en ese momento) y "googleando" encontré muy poca informacion.
2-No necesitaba una sola cadena, necesitaba por separado los años, los meses y los dias, para poder trabajarlos por separado mas adelante en mis scripts de php.
3-No debía enviar ningún parámetro para obtener el resultado.

Agradezco sus aportes tambien, y en hora buena, ahora tengo un poco mas de tiempo, y puedo utilizar el ejemplo de gnzsoloyo para obtenes los años los meses y los dias, con el plus de las horas, los minutos y los segundo, gracias, es mejor tarde que nunca.

Estoy agradecido!!!

Etiquetas: cortez, djcandido, elsalvador, flores, jaime, jeovanny, ptasv
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 04:55.