Calcola l’età in MySQL (InnoDb)

Se ho una data di nascita di una persona memorizzata in una tabella nel formato dd-mm-yyyy e la sottraggo dalla data corrente, in quale formato viene restituita la data?

Come posso utilizzare questo formato restituito per calcolare l’età di qualcuno?

Se il valore è archiviato come tipo di dati DATETIME:

 SELECT YEAR(CURRENT_TIMESTAMP) - YEAR(dob) - (RIGHT(CURRENT_TIMESTAMP, 5) < RIGHT(dob, 5)) as age FROM YOUR_TABLE 

Meno preciso quando si considerano gli anni bisestili:

 SELECT DATEDIFF(CURRENT_DATE, STR_TO_DATE(t.birthday, '%d-%m-%Y'))/365 AS ageInYears FROM YOUR_TABLE t 

È ansible utilizzare la funzione TIMESTAMPDIFF(unit, datetime_expr1, datetime_expr2) :

 SELECT TIMESTAMPDIFF(YEAR, '1970-02-01', CURDATE()) AS age 

dimostrazione

 select *,year(curdate())-year(dob) - (right(curdate(),5) < right(dob,5)) as age from your_table 

in questo modo consideri anche il mese e il giorno di nascita per avere un calcolo più preciso dell'età.

 SELECT TIMESTAMPDIFF (YEAR, YOUR_COLUMN, CURDATE()) FROM YOUR_TABLE AS AGE 

Clicca per la demo ..

Semplice ma elegante ..

 select floor(datediff (now(), birthday)/365) as age 

Semplicemente:

 DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(`birthDate`)), '%Y')+0 AS age 

Prova questo:

 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); 

Ritorna quest’anno – anno di nascita (quanti anni avrà la persona quest’anno dopo il compleanno) e si adeguerà in base al fatto che la persona abbia già avuto il compleanno quest’anno.

Non soffre degli errori di arrotondamento degli altri metodi presentati qui.

Liberamente adattato da qui

Ecco come calcolare l’età in 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 

Puoi fare una funzione per farlo:

 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 ; 

Ora puoi ottenere l’età da una data:

 select getIdade('1983-09-16'); 

Se la data è in formato Ymd H: i: s, puoi farlo:

 select getIdade(substring_index('1983-09-16 23:43:01', ' ', 1)); 

Puoi riutilizzare questa funzione ovunque;)

Preferisco usare una funzione in questo modo.

 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 ; 

ora da usare

 SELECT F_AGE('1979-02-11') AS AGE; 

O

 SELECT F_AGE(date) AS age FROM table; 

Dato che la domanda viene taggata per mysql , ho la seguente implementazione che funziona per me e spero che alternative simili sarebbero disponibili per altri RDBMS. Ecco lo sql:

 select YEAR(now()) - YEAR(dob) - ( DAYOFYEAR(now()) < DAYOFYEAR(dob) ) as age from table where ... 

Semplicemente

 SELECT birthdate, (YEAR(CURDATE())-YEAR(birthdate)) AS age FROM `member` 

data di nascita è il nome del campo che mantiene il nome della data di nascita prendere CURDATE () torna all’anno con il comando YEAR () meno con YEAR () dal campo della data di nascita

Esistono due semplici modi per farlo:

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"))