How to calculate difference between two dates in months in MySQL

前端 未结 7 1593
眼角桃花
眼角桃花 2020-12-13 15:58

I have two columns in a MySQL table:

  • DateOfService (datetime)
  • BirthDate (date)

I want to run a MySQL query that will provide date diffe

相关标签:
7条回答
  • 2020-12-13 16:38

    The 'right' answer depends on exactly what you need. I like to round to the closest whole number.

    Consider these examples: 1st January -> 31st January: It's 0 whole months, and almost 1 month long. 1st January -> 1st February? It's 1 whole month, and exactly 1 month long.

    To get the number of whole months, use:

    SELECT TIMESTAMPDIFF(MONTH, '2018-01-01', '2018-01-31');  => 0
    SELECT TIMESTAMPDIFF(MONTH, '2018-01-01', '2018-02-01');  => 1
    

    To get a rounded duration in months, you could use:

    SELECT ROUND(TIMESTAMPDIFF(DAY, '2018-01-01', '2018-01-31')*12/365.24); => 1
    SELECT ROUND(TIMESTAMPDIFF(DAY, '2018-01-01', '2018-01-31')*12/365.24); => 1
    

    This is accurate to +/- 5 days and for ranges over 1000 years. Zane's answer is obviously more accurate, but it's too verbose for my liking.

    0 讨论(0)
  • 2020-12-13 16:50

    Based on a summary of all answers and a Google search, I think there are four almost similar ways to write it:

    1)

    TIMESTAMPDIFF(MONTH, Start_date, End_date) AS Period
    

    E.g.

    TIMESTAMPDIFF(MONTH, MIN(r.rental_date), MAX(r.rental_date)) AS Period
    

    2)

    PERIOD_DIFF(date_format(now(), '%Y%m'), date_format(time, '%Y%m')) as months
    

    Or

    PERIOD_DIFF(date_format(End_date(), '%Y%m'), date_format(Start_date, '%Y%m')) as months
    

    E.g.

    PERIOD_DIFF(date_format(MAX(r.rental_date), '%Y%m'), date_format(MIN(r.rental_date), '%Y%m')) as months
    

    3)

    PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM NOW()), EXTRACT(YEAR_MONTH FROM time)) AS months
    

    OR

    PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM End_date()), EXTRACT(YEAR_MONTH FROM Start_date)) AS months
    

    E.g.

    PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM MAX(r.rental_date)), EXTRACT(YEAR_MONTH FROM MIN(r.rental_date))) as Months
    

    4)

    PERIOD_DIFF(concat(year(d1),if(month(d1)<10,'0',''),month(d1)), concat(year(d2),if(month(d2)<10,'0',''),month(d2))) as Months**
    

    E.g.

    PERIOD_DIFF(
                concat(year(MAX(r.rental_date)),if(month(MAX(r.rental_date))<10,'0',''),month(MAX(r.rental_date))),
                concat(year(MIN(r.rental_date)),if(month(MIN(r.rental_date))<10,'0',''),month(MIN(r.rental_date)))
               ) as Months
    
    0 讨论(0)
  • 2020-12-13 16:53

    Try this:

    SELECT DATEDIFF(DateOfService, BirthDate) / 30 as months FROM ...

    0 讨论(0)
  • 2020-12-13 16:55

    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')
    -- 0
    

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

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

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

    It basically gets the number of months elapsed from the first date in the parameter list. This solution accounts for the varying amount of days in each month (28,30,31) as well as leap years.


    If you want decimal precision in the number of months elapsed, it's a little more complicated, 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
    
    0 讨论(0)
  • 2020-12-13 17:00
    TIMESTAMPDIFF(MONTH, Start_date, End_date)
    

    Example:

    SELECT TIMESTAMPDIFF(MONTH, BirthDate, DateOfService) AS Months FROM Table
    
    0 讨论(0)
  • 2020-12-13 17:04

    This could work:

    SELECT 12 * (YEAR(DateOfService) 
                  - YEAR(BirthDate)) 
           + (MONTH(DateOfService) 
               - MONTH(BirthDate)) AS months 
    FROM table
    
    0 讨论(0)
提交回复
热议问题