Ver Mensaje Individual
  #1 (permalink)  
Antiguo 19/10/2011, 14:37
Avatar de djcandido
djcandido
 
Fecha de Ingreso: junio-2009
Ubicación: San Salvador
Mensajes: 50
Antigüedad: 15 años, 6 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.