web-dev-qa-db-fra.com

Obtenir la différence en années entre deux dates dans MySQL sous forme d'entier

J'essaie de calculer quel âge a une personne dans une base de données.
Supposons avoir cette table simple: 

student(id, birth_date);

Où id est la clé primaire (la table est vraiment plus complexe mais je l’ai simplifiée).
Je veux savoir quel âge a une personne célibataire:

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

Mais il retourne un résultat en jours, et non en années. Je pourrais le diviser par 365: 

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

Mais il retourne une valeur à virgule flottante et je veux un entier.
Je pourrais donc calculer les années: 

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

Mais il y a un problème: par exemple, nous sommes en mai, si une personne née en juin 1970 est en guerre, il a encore 31 ans et pas 32 ans, mais l'expression revient 32.
Je ne peux pas sortir de ce problème, quelqu'un peut-il m'aider?

17
Ramy Al Zuhouri
select id, floor(datediff(curdate(),birth_date) / 365)
from student

Qu'en est-il du revêtement de sol pour que le résultat soit un entier?

15
Scott Bonner

Pour tous ceux qui rencontrent ceci:

une autre façon de procéder est la suivante:

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

Pour les différences en mois, remplacez YEAR par MONTH et par jours, remplacez YEAR par DAY

J'espère que cela pourra aider!

Essayer:

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

La réponse acceptée est presque correcte, mais peut conduire à des résultats erronés.

En fait, / 365 ne prend pas en compte les années bissextiles et peut conduire à des résultats de fausseté si vous comparez une date qui a le même jour et le même mois que la date de naissance.

Pour être plus précis, vous devez le diviser par le nombre moyen de jours en années pendant 4 ans, autrement dit (365 * 4) + 1 (année bissextile tous les 4 ans) => 365,25.

Et vous serez plus précis:

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

Testé pour l'un de mes projets et ça marche.

4
Cyril N.

Pourquoi ne pas utiliser la fonction FLOOR () de MySQL sur le résultat de votre deuxième approche? Toutes les fractions seront supprimées, vous donnant le résultat souhaité.

1
Harper Shelby

Je suggérerais ceci:

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

Cela devrait très bien fonctionner avec les années bissextiles ;-)

0
Marek Demčák

Je n'ai pas assez de réputation pour ajouter un commentaire à une réponse de Rat-a-tat-a-tat Ratatouille afin d'améliorer son code. Voici la meilleure requête SQL:

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

Cela est préférable car parfois, "date de naissance" peut ne contenir que l'année de naissance, alors que le jour et le mois ont la valeur 0. Si TIMESTAMPDIFF () renvoie NULL, nous pouvons trouver l'âge approximatif en soustrayant l'année en cours de l'année de naissance.

0

Cela fonctionne, même en tenant compte des années bissextiles!

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

Assurez-vous simplement de conserver floor() car la décimale n’est pas nécessaire.

0
Steve Burke

Vous pouvez l'utiliser pour obtenir une valeur entière.

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

Si vous voulez en savoir plus sur CONVERT() et CAST()voici le lien.

0
jams