The difference in months between dates in MySQL The difference in months between dates in MySQL mysql mysql

The difference in months between dates in MySQL


Month-difference between any given two dates:

I'm surprised this hasn't been mentioned yet:

Have a look at the TIMESTAMPDIFF() function in MySQL.

What this allows you to do is pass in two TIMESTAMP or DATETIME values (or even DATE as MySQL will auto-convert) as well as the unit of time you want to base your difference on.

You can specify MONTH as the unit in the first parameter:

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

It basically gets the number of months elapsed from the first date in the parameter list. This solution automatically compensates for the varying amount of days in each month (28,30,31) as well as taking into account leap years — you don't have to worry about any of that stuff.


Month-difference with precision:

It's a little more complicated if you want to introduce decimal precision in the number of months elapsed, but here is how you can do it:

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  )

Where startdate and enddate are your date parameters, whether it be from two date columns in a table or as input parameters from a script:

Examples:

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


PERIOD_DIFF calculates months between two dates.

For example, to calculate the difference between now() and a time column in your_table:

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


I use also PERIOD_DIFF. To get the year and the month of the date, I use the function EXTRACT:

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