Question: I'm looking to calculate the number of months between 2 date time fields.

Is there a better way than getting the Unix timestamp and then dividing by 2 592 000 (seconds) and rounding up within MySQL?

Answer: 
Month-difference between any given two dates:
=============================================

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

Have a look at the [***TIMESTAMPDIFF()***](http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_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

```
The Query will be like:

```
select period_diff(date_format(now(),"%Y%m"),date_format(created,"%Y%m")) from customers where..

```

Gives a number of calendar months since the created datestamp on a customer record, letting MySQL do the month selection internally.