meses - Calcular edad en MySQL(InnoDb)
timestampdiff mysql (13)
Dado que la pregunta se está etiquetando para mysql
, tengo la siguiente implementación que me funciona y espero que existan alternativas similares para otros RDBMS. Aquí está el sql:
select YEAR(now()) - YEAR(dob) - ( DAYOFYEAR(now()) < DAYOFYEAR(dob) ) as age
from table
where ...
Si tengo una fecha de nacimiento de personas almacenada en una tabla con el formato dd-mm-yyyy
y la resta de la fecha actual, ¿en qué formato se devuelve la fecha?
¿Cómo puedo usar este formato devuelto para calcular la edad de alguien?
Esta es la forma de calcular la edad en MySQL:
select
date_format(now(), ''%Y'') - date_format(date_of_birth, ''%Y'') -
(date_format(now(), ''00-%m-%d'') < date_format(date_of_birth, ''00-%m-%d''))
as age from table
Hay dos formas simples de hacer eso:
1-
select("users.birthdate",
DB::raw("FLOOR(DATEDIFF(CURRENT_DATE, STR_TO_DATE(users.birthdate, ''%Y-%m-%d''))/365) AS age_way_one"),
2-
select("users.birthdate",DB::raw("(YEAR(CURDATE())-YEAR(users.birthdate)) AS age_way_two"))
Prefiero usar una función de esta manera.
DELIMITER $$ DROP FUNCTION IF EXISTS `db`.`F_AGE` $$
CREATE FUNCTION `F_AGE`(in_dob datetime) RETURNS int(11)
NO SQL
BEGIN
DECLARE l_age INT;
IF DATE_FORMAT(NOW( ),''00-%m-%d'') >= DATE_FORMAT(in_dob,''00-%m-%d'') THEN
-- This person has had a birthday this year
SET l_age=DATE_FORMAT(NOW( ),''%Y'')-DATE_FORMAT(in_dob,''%Y'');
ELSE
-- Yet to have a birthday this year
SET l_age=DATE_FORMAT(NOW( ),''%Y'')-DATE_FORMAT(in_dob,''%Y'')-1;
END IF;
RETURN(l_age);
END $$
DELIMITER ;
ahora para usar
SELECT F_AGE(''1979-02-11'') AS AGE;
O
SELECT F_AGE(date) AS age FROM table;
Prueba esto:
SET @birthday = CAST(''1980-05-01'' AS DATE);
SET @today = CURRENT_DATE();
SELECT YEAR(@today) - YEAR(@birthday) -
(CASE WHEN
MONTH(@birthday) > MONTH(@today) OR
(MONTH(@birthday) = MONTH(@today) AND DAY(@birthday) > DAY(@today))
THEN 1
ELSE 0
END);
Vuelve este año - año de nacimiento (cuántos años tendrá la persona este año después del cumpleaños) y se ajusta en función de si la persona ya tuvo el cumpleaños este año.
No sufre los errores de redondeo de otros métodos presentados aquí.
Adaptado libremente de here
Puede hacer una función para hacerlo:
drop function if exists getIdade;
delimiter |
create function getIdade( data_nascimento datetime )
returns int
begin
declare idade int;
declare ano_atual int;
declare mes_atual int;
declare dia_atual int;
declare ano int;
declare mes int;
declare dia int;
set ano_atual = year(curdate());
set mes_atual = month( curdate());
set dia_atual = day( curdate());
set ano = year( data_nascimento );
set mes = month( data_nascimento );
set dia = day( data_nascimento );
set idade = ano_atual - ano;
if( mes > mes_atual ) then
set idade = idade - 1;
end if;
if( mes = mes_atual and dia > dia_atual ) then
set idade = idade - 1;
end if;
return idade;
end|
delimiter ;
Ahora puede obtener la edad de una fecha:
select getIdade(''1983-09-16'');
Si la fecha está en formato Ymd H: i: s, puede hacer esto:
select getIdade(substring_index(''1983-09-16 23:43:01'', '' '', 1));
Puedes reutilizar esta función en cualquier lugar;)
Puede usar la función TIMESTAMPDIFF(unit, datetime_expr1, datetime_expr2)
:
SELECT TIMESTAMPDIFF(YEAR, ''1970-02-01'', CURDATE()) AS age
Si el valor se almacena como un tipo de datos DATETIME:
SELECT YEAR(CURRENT_TIMESTAMP) - YEAR(dob) - (RIGHT(CURRENT_TIMESTAMP, 5) < RIGHT(dob, 5)) as age
FROM YOUR_TABLE
Menos preciso cuando se consideran años bisiestos:
SELECT DATEDIFF(CURRENT_DATE, STR_TO_DATE(t.birthday, ''%d-%m-%Y''))/365 AS ageInYears
FROM YOUR_TABLE t
Simplemente hazlo
SELECT birthdate, (YEAR(CURDATE())-YEAR(birthdate)) AS age FROM `member`
fecha de nacimiento es el nombre del campo que guarda el nombre de la fecha de nacimiento toma CURDATE () cambia al año por AÑO () comando menos con AÑO () desde el campo de fecha de nacimiento
Simplemente:
DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(`birthDate`)), ''%Y'')+0 AS age
SELECT TIMESTAMPDIFF (YEAR, YOUR_COLUMN, CURDATE()) FROM YOUR_TABLE AS AGE
Simple pero elegante ..
select *,year(curdate())-year(dob) - (right(curdate(),5) < right(dob,5)) as age from your_table
de esta manera, considera incluso el mes y el día de nacimiento para tener un cálculo de edad más preciso.
select floor(datediff (now(), birthday)/365) as age