transcurrido timestampdiff tiempo minutos horas fechas entre ejemplos diferencia consulta calcular años mysql

timestampdiff - Obtenga la diferencia en años entre dos fechas en MySQL como un entero



tiempo transcurrido entre dos fechas mysql (9)

Estoy tratando de calcular cuántos años tiene una persona en una base de datos.
Supongamos que tenemos esta tabla simple:

student(id, birth_date);

Donde id es la clave principal (en realidad la tabla es más compleja, pero la he simplificado).
Quiero saber cuántos años tiene una sola persona:

select id, datediff(curdate(),birth_date) from student

Pero devuelve un resultado en días, y no en años. Podría dividirlo por 365:

select id, datediff(curdate(),birth_date) / 365 from student

Pero devuelve un valor de punto flotante, y quiero un entero.
Para que yo pudiera calcular los años:

select id, year(curdate())-year(birth_date) from student

Pero hay un problema: por ejemplo, ahora es mayo, si una persona que nació en la guerra en junio de 1970 aún tiene 31 años y no 32, pero la expresión devuelve 32.
No puedo salir de este problema, ¿puede alguien ayudarme?


¿Por qué no usar la función FLOOR () de MySQL en la salida de su segundo enfoque? Cualquier fracción será eliminada, dándole el resultado que desea.


Esto funciona, incluso teniendo en cuenta años bisiestos!

select floor((cast(date_format(''2016-02-29'',''%Y%m%d'') as int) - cast(date_format(''1966-03-01'',''%Y%m%d'') as int)/10000);

Solo asegúrate de mantener el floor() ya que el decimal no es necesario


La respuesta aceptada es casi correcta, pero puede llevar a resultados erróneos.

De hecho, / 365 no toma en cuenta los años bisiestos, y puede llevar a resultados falsos si compara una fecha que tiene el mismo día y mes que la fecha de nacimiento.

Para ser más precisos, tiene que dividirlo por el promedio de días en años durante 4 años, también conocido como (365 * 4) + 1 (el año bisiesto cada 4 años) => 365.25

Y serás más preciso:

select id, floor(datediff(curdate(),birth_date) / 365.25) from student

Probado para uno de mis proyectos y está funcionando.


No tengo suficiente reputación para agregar un comentario a una respuesta de Rat-a-tat-a-tat Ratatouille para mejorar su código. Aquí está la mejor consulta de SQL:

SELECT IFNULL(TIMESTAMPDIFF(YEAR, birthdate, CURDATE()), YEAR(CURDATE()) - YEAR(birthdate)) AS age

Esto es mejor porque a veces la "fecha de nacimiento" puede contener solo el año de nacimiento, mientras que el día y el mes son 0. Si TIMESTAMPDIFF () devuelve NULL, podemos encontrar una edad aproximada restando el año actual al año de nacimiento.


Para cualquiera que se encuentre con esto:

Otra forma en que esto se puede hacer es:

SELECT TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) AS difference FROM student

Para las diferencias en meses, reemplace YEAR con MONTH , y para días reemplace YEAR con DAY

¡Espero que ayude!


Puedes usar esto para obtener un valor entero.

select id, CAST(datediff(curdate(),birth_date) / 365 as int) from student

Si desea leer acerca de CONVERT() y CAST() aquí está el enlace.


Tratar:

SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birth_date)), ''%Y'')+0 AS age FROM student;


Yo sugeriría esto:

DATE_FORMAT(NOW(),"%Y") -DATE_FORMAT(BirthDate,''%Y'') -( IF( DATE_FORMAT(NOW(),"%m-%d") < DATE_FORMAT(BrthDate,''%m-%d''), 1, 0 ) ) as Age

Esto debería funcionar con años bisiestos muy bien ;-)


select id, floor(datediff(curdate(),birth_date) / 365) from student

¿Qué pasa con el uso del suelo para que el resultado sea un número entero?