En MySQL, podrías hacer esto o algo parecido. Te he puesto una resta entre dos fechas traídas de la base. Si se tratase de una resta con la fecha actual, tendrías que utilizar como fecha2 el NOW(). Observa que lo primero que hago sacar la diferencia en segundos entre las fechas, para lo que utilizo TIMESTAMPDIFF(), una función que tiene MySQL desde la versión 5. Si no usas dicha versión, sino otras anteriores, puedes utilizar en su lugar una simple resta como UNIX_TIMESTAMP(fecha2) - UNIX_TIMESTAMP(fecha1), que te ofrece lo que buscamos, la diferencia en segundos entre ambas fechas. El método es el de división exacta y resto de división exacta, siempre a partir de segundos.
Cita: SELECT fecha1, fecha2, FLOOR( TIMESTAMPDIFF(
SECOND , fecha1, fecha2 ) /604800 ) AS semanas, FLOOR( (
TIMESTAMPDIFF(
SECOND , fecha1, fecha2 ) %604800 ) /86400
) AS dias, FLOOR( (
TIMESTAMPDIFF(
SECOND , fecha1, fecha2 ) %86400 ) /3600
) AS horas, FLOOR( (
TIMESTAMPDIFF(
SECOND , fecha1, fecha2 ) %3600 ) /60
) AS minutos, FLOOR( TIMESTAMPDIFF(
SECOND , fecha1, fecha2 ) %60 ) AS segundos
FROM `diffecha`
Por supuesto, puedes utilizar una de las muchas funciones creadas para PHP, ASP, etc. que podrás encontrar en la red y que hacen lo mismo. Es más, en PHP hay alguna hecha en el foro. La función se llama seg2tiempo, que aunque es antigua, hace lo que quieres y puedes adaptarla. Echa un vistazo con el buscador.
Observarás que no pongo meses, ni años. La razón es que eso ya no sería exacto. Me explico. Los meses tendríamos que hacerlos de 30 días todos, y los años de 365 días, y no siempre es así. Si quieres puede hacerse, aunque el dato ya no sería exacto. Sólo tendrías que aplicar a meses y años la misma lógica seguida para semanas, días, horas, etc., pero haciendo las operaciones con meses de 30 días, y años de 365 días.