94 votes

La différence en mois entre les dates dans MySQL

Je cherche à calculer le nombre de mois entre 2 champs de date et heure.

Existe-t-il un meilleur moyen que de récupérer l'horodatage unix, de le diviser par 2 592 000 (secondes) et de l'arrondir dans MySQL ?

233voto

Zane Bien Points 13918

Différence de mois entre deux dates données :

Je suis surpris que cela n'ait pas encore été mentionné :

Jetez un coup d'œil à la TIMESTAMPDIFF() dans MySQL.

Ce que cela vous permet de faire est de passer dans deux TIMESTAMP o DATETIME (ou même DATE car MySQL effectuera une conversion automatique) ainsi que l'unité de temps sur laquelle vous souhaitez baser votre différence.

Vous pouvez spécifier MONTH comme l'unité du premier paramètre :

SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-04')
-- Outputs: 0

SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-05')
-- Outputs: 1

SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-15')
-- Outputs: 1

SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-12-16')
-- Outputs: 7

Il s'agit essentiellement d'obtenir le nombre de mois écoulés depuis la première date de la liste de paramètres. Cette solution compense automatiquement le nombre variable de jours dans chaque mois (28, 30, 31) et prend en compte les années bissextiles - vous n'avez pas à vous préoccuper de tout cela.


Différence de mois avec précision :

C'est un peu plus compliqué si vous voulez introduire une précision décimale dans le nombre de mois écoulés, mais voici comment vous pouvez le faire :

SELECT 
  TIMESTAMPDIFF(MONTH, startdate, enddate) +
  DATEDIFF(
    enddate,
    startdate + INTERVAL
      TIMESTAMPDIFF(MONTH, startdate, enddate)
    MONTH
  ) /
  DATEDIFF(
    startdate + INTERVAL
      TIMESTAMPDIFF(MONTH, startdate, enddate) + 1
    MONTH,
    startdate + INTERVAL
      TIMESTAMPDIFF(MONTH, startdate, enddate)
    MONTH
  )

startdate y enddate sont vos paramètres de date, que ce soit à partir de deux colonnes de date dans un tableau ou comme paramètres d'entrée d'un script :

Exemples :

With startdate = '2012-05-05' AND enddate = '2012-05-27':
-- Outputs: 0.7097

With startdate = '2012-05-05' AND enddate = '2012-06-13':
-- Outputs: 1.2667

With startdate = '2012-02-27' AND enddate = '2012-06-02':
-- Outputs: 3.1935

9 votes

C'est la bonne réponse, tous les votes positifs pour le PERIODDIFF le commentaire sur la réponse choisie est très trompeur.

5 votes

Merci, dans mon cas j'avais besoin de dates inclusives, donc je remplace tous les "enddate" par "date_add(enddate,interval 1 day)". Alors 2014-03-01 à 2014-05-31 donnera 3.00 au lieu de 2.97.

2 votes

Merci beaucoup.....special thanx pour "Month-difference with precision :". Vous êtes la star de mysql

107voto

Max Caceres Points 1197

PERIOD_DIFF calcule les mois entre deux dates.

Par exemple, pour calculer la différence entre now() et une colonne de temps dans votre_table :

select period_diff(date_format(now(), '%Y%m'), date_format(time, '%Y%m')) as months from your_table;

1 votes

Savez-vous ce qu'il fait quand il peut y avoir 11 mois et 1 jour, donc 12 mois, mais que si vous passez à des mois de 30 jours, il y a toujours 11 mois ?

1 votes

11 mois et 1 jour donnerait 11 mois avec l'exemple ci-dessus. PERIOD_DIFF ne tient pas compte des mois de 30 ou 31 jours.

30voto

Smolla Points 371

J'utilise aussi PERIOD_DIFF . Pour obtenir l'année et le mois de la date, j'utilise la fonction EXTRACT :

  SELECT PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM NOW()), EXTRACT(YEAR_MONTH FROM time)) AS months FROM your_table;

2 votes

Incroyable ! Il utilise 50% moins de temps que DATE_FORMAT méthode, merci ! +1

1 votes

Ici pour un timestamp unix SELECT PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM NOW()), EXTRACT(YEAR_MONTH FROM FROM_UNIXTIME(time, "%Y%m%d"))) AS months FROM your_table;

3 votes

Ceci est incorrect, PERIOD_DIFF ne prend pas la valeur des jours, vous calculez donc le nombre de mois, arrondi au mois le plus proche s'il y a moins d'un nombre entier de mois. Vous devez modifier votre réponse pour que cela soit clair.

18voto

SoapBox Points 14183

En DATEDIFF peut vous donner le nombre de jours entre deux dates. Ce qui est plus précis, puisque... comment définir un mois (28, 29, 30 ou 31 jours) ?

72 votes

PERIODDIFF peut calculer le nombre de mois avec précision.

10 votes

"Plus précis" est incroyablement subjectif lorsqu'il s'agit de dates. Si, par exemple, vous êtes dans une entreprise qui a des cycles mensuels, le besoin de savoir combien de mois séparent deux dates peut être plus important que le nombre de jours pour la raison même que vous avez exposée ci-dessus. Quelle est la durée d'un mois ? Si j'ai besoin du nombre de mois, je ne peux pas simplement diviser par 30.

6 votes

Ce n'est pas la bonne réponse ; vous devez marquer Max's réponse correcte, ci-dessous.

9voto

Je préfère cette méthode, car tout le monde comprendra clairement au premier coup d'œil :

SELECT
    12 * (YEAR(to) - YEAR(from)) + (MONTH(to) - MONTH(from)) AS months
FROM
    tab;

0 votes

Stanislav - cette méthode est tout à fait appropriée si vous voulez connaître les données PAR NUMÉRO DE MOIS. J'ai quelques rapports qui montrent les ventes par mois (Jan/Feb/Mar etc) mais il y a tellement de données (graphiques par trimestre/année/années précédentes etc) que je ne peux pas grouper par quoi que ce soit. J'ai besoin d'extraire les données brutes et de les parcourir en boucle - lorsqu'on est le 31 janvier, de nombreux calculs placent le "mois prochain" en mars alors que nous, les humains, savons qu'il s'agit de février. Si on est le 2/4, certains calculs disent que le 31 janvier est "ce mois-ci" mais que le 18 janvier était "le mois dernier".

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