Différence de mois entre deux dates données :
Je suis surpris que cela n'ait pas encore été mentionné :
Jetez un œil au TIMESTAMPDIFF() fonction dans MySQL.
Ce que cela vous permet de faire est de passer en deux TIMESTAMP
ou DATETIME
valeurs (ou même DATE
comme MySQL se convertira automatiquement) ainsi que l'unité de temps sur laquelle vous souhaitez baser votre différence.
Vous pouvez spécifier MONTH
comme unité dans le 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 obtient essentiellement le nombre de mois écoulés depuis la première date de la liste des paramètres. Cette solution compense automatiquement le nombre variable de jours de chaque mois (28,30,31) et tient compte des années bissextiles ; vous n'avez pas à vous soucier de tout cela.
Différence mensuelle avec précision :
C'est un peu plus compliqué si vous souhaitez introduire une précision décimale dans le nombre de mois écoulés, mais voici comment procéder :
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
)
Où startdate
et enddate
sont vos paramètres de date, que ce soit à partir de deux colonnes de date dans une table ou en tant que 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