49 votes

Comment obtenir la différence d'années entre deux dates différentes ?

Je souhaite obtenir la différence d'années à partir de deux dates différentes en utilisant la base de données MySQL.

par exemple :

  • 2011-07-20 - 2011-07-18 => 0 année
  • 2011-07-20 - 2010-07-20 => 1 an
  • 2011-06-15 - 2008-04-11 => 2 3 ans
  • 2011-06-11 - 2001-10-11 => 9 ans

Qu'en est-il de la syntaxe SQL ? Existe-t-il une fonction intégrée dans MySQL pour produire le résultat ?

71voto

Bohemian Points 134107

Voici l'expression qui tient également compte des années bissextiles :

YEAR(date1) - YEAR(date2) - (DATE_FORMAT(date1, '%m%d') < DATE_FORMAT(date2, '%m%d'))

Cela fonctionne parce que l'expression (DATE_FORMAT(date1, '%m%d') < DATE_FORMAT(date2, '%m%d')) est true si la date 1 est "antérieure dans l'année" à la date 2 y parce que dans mysql, true = 1 y false = 0 L'ajustement consiste donc simplement à soustraire la "vérité" de la comparaison.

Cela donne des valeurs correctes pour vos cas de test, sauf pour le test n° 3 - je pense qu'il devrait être "3" pour être cohérent avec le test n° 1 :

create table so7749639 (date1 date, date2 date);
insert into so7749639 values
('2011-07-20', '2011-07-18'),
('2011-07-20', '2010-07-20'),
('2011-06-15', '2008-04-11'),
('2011-06-11', '2001-10-11'),
('2007-07-20', '2004-07-20');
select date1, date2,
YEAR(date1) - YEAR(date2)
    - (DATE_FORMAT(date1, '%m%d') < DATE_FORMAT(date2, '%m%d')) as diff_years
from so7749639;

Sortie :

+------------+------------+------------+
| date1      | date2      | diff_years |
+------------+------------+------------+
| 2011-07-20 | 2011-07-18 |          0 |
| 2011-07-20 | 2010-07-20 |          1 |
| 2011-06-15 | 2008-04-11 |          3 |
| 2011-06-11 | 2001-10-11 |          9 |
| 2007-07-20 | 2004-07-20 |          3 |
+------------+------------+------------+

Véase SQLFiddle

28voto

pgee70 Points 406

J'aime la solution proposée par Bohemian, mais qu'en est-il de l'utilisation de différence de temps

select date1, date2,timestampdiff(YEAR,date2,date1) from so7749639

sqlfiddle

semble plus facile.

1 votes

C'est la meilleure réponse/la plus simple.

12voto

sanmai Points 3990
mysql> SELECT FLOOR(DATEDIFF('2011-06-11','2001-10-11')/365);
+------------------------------------------------+
| FLOOR(DATEDIFF('2011-06-11','2001-10-11')/365) |
+------------------------------------------------+
|                                              9 |
+------------------------------------------------+
1 row in set (0.00 sec)

DATEDIFF() renvoie la différence en jours entre deux dates. Cette méthode ne prend pas spécifiquement en compte les années bissextiles, mais elle peut fonctionner dans de tels cas :

mysql> SELECT FLOOR(DATEDIFF('2007-07-11','2004-07-11')/365);
+------------------------------------------------+
| FLOOR(DATEDIFF('2007-07-11','2004-07-11')/365) |
+------------------------------------------------+
|                                              3 |
+------------------------------------------------+
1 row in set (0.00 sec)

0 votes

L'Enquirer ne les mentionne pas du tout, je suppose donc qu'il s'en moque.

2 votes

Désolé, j'ai oublié d'ajouter un cas de test pour les années bissextiles.

11voto

Simplement par : SELECT TIMESTAMPDIFF(YEAR, date1, date2) AS difference FROM table .

3voto

stivlo Points 28997

Vous pouvez simplement utiliser

SELECT ROUND((TO_DAYS(date2) - TO_DAYS(date1)) / 365) ...

Enveloppez-la également avec ABS() si vous voulez toujours un nombre positif, quelle que soit la date qui précède l'autre.

Avec ROUND() 0,6 année sera considérée comme 1 année. Si vous voulez compter uniquement les années complètes, vous pouvez utiliser FLOOR() . Dans ce cas, 0,6 année sera considérée comme 0 année, et 1,9 année sera considérée comme 1 année.

1 votes

Il devrait s'agir de TO_DAYS dans les deux cas. Je ne peux pas l'éditer car les modifications doivent être >=6 symboles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X