Wenn ich das Geburtsdatum einer Person in einer Tabelle im Formular gespeichert habe dd-mm-yyyy
und es vom aktuellen Datum abziehe, in welchem Format wird das Rückgabedatum angegeben?
Wie kann ich dieses zurückgegebene Format verwenden, um das Alter einer Person zu berechnen?
dd-mm-yyyy
? Wenn es sich um einendate
Datentyp handelt, wird es wahrscheinlich in einem numerischen Format gespeichert (z. B. als Ganzzahl mit Tagen seit einem Startpunkt)Antworten:
Wenn der Wert als Datentyp DATETIME gespeichert ist:
SELECT YEAR(CURRENT_TIMESTAMP) - YEAR(dob) - (RIGHT(CURRENT_TIMESTAMP, 5) < RIGHT(dob, 5)) as age FROM YOUR_TABLE
Weniger genau, wenn man Schaltjahre betrachtet:
SELECT DATEDIFF(CURRENT_DATE, STR_TO_DATE(t.birthday, '%d-%m-%Y'))/365 AS ageInYears FROM YOUR_TABLE t
quelle
Sie können folgende
TIMESTAMPDIFF(unit, datetime_expr1, datetime_expr2)
Funktion verwenden:SELECT TIMESTAMPDIFF(YEAR, '1970-02-01', CURDATE()) AS age
Demo
quelle
select *,year(curdate())-year(dob) - (right(curdate(),5) < right(dob,5)) as age from your_table
Auf diese Weise berücksichtigen Sie sogar Monat und Tag der Geburt, um eine genauere Altersberechnung zu erhalten.
quelle
year(curdate())-year(dob) - (dayofyear(curdate()) < dayofyear(dob)) as age
, und ich finde, dass der Tag des Jahres eleganter ist.SELECT TIMESTAMPDIFF (YEAR, YOUR_COLUMN, CURDATE()) FROM YOUR_TABLE AS AGE
Klicken Sie für die Demo ..
Einfach aber elegant ..
quelle
select floor(datediff (now(), birthday)/365) as age
quelle
Einfach:
quelle
Versuche dies:
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);
Es kehrt in diesem Jahr zurück - Geburtsjahr (wie alt die Person in diesem Jahr nach dem Geburtstag sein wird) und passt sich an, je nachdem, ob die Person dieses Jahr noch Geburtstag hatte.
Es leidet nicht unter den Rundungsfehlern anderer hier vorgestellter Methoden.
Frei angepasst von hier
quelle
Da die Frage markiert wird
mysql
, habe ich die folgende Implementierung, die für mich funktioniert, und ich hoffe, dass ähnliche Alternativen für andere RDBMS verfügbar sind. Hier ist die SQL:select YEAR(now()) - YEAR(dob) - ( DAYOFYEAR(now()) < DAYOFYEAR(dob) ) as age from table where ...
quelle
Einfach machen
SELECT birthdate, (YEAR(CURDATE())-YEAR(birthdate)) AS age FROM `member`
Geburtsdatum ist ein Feldname, der den Namen des Geburtsdatums beibehält. Nehmen Sie CURDATE (), um mit dem Befehl YEAR () minus mit YEAR () aus dem Feld für das Geburtsdatum auf Jahr umzuschalten
quelle
So berechnen Sie das Alter 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
quelle
Sie können eine Funktion dafür erstellen:
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 ;
Jetzt können Sie das Alter von einem Datum abrufen:
select getIdade('1983-09-16');
Wenn Ihr Datum im Format Ymd H: i: s vorliegt, können Sie Folgendes tun:
select getIdade(substring_index('1983-09-16 23:43:01', ' ', 1));
Sie können diese Funktion überall wiederverwenden;)
quelle
Ich bevorzuge es, eine Funktion auf diese Weise zu verwenden.
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 ;
jetzt zu verwenden
SELECT F_AGE('1979-02-11') AS AGE;
ODER
SELECT F_AGE(date) AS age FROM table;
quelle
Dafür gibt es zwei einfache Möglichkeiten:
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"))
quelle