如何计算MySQL中几个月的两个日期之间的差异

时间:2011-04-12 10:31:00

标签: mysql date

我在MySQL表中有两列:

  • DateOfService(datetime)
  • BirthDate(日期)

我想运行一个MySQL查询,它将在几个月内提供这两个字段之间的日期差异。

如何在MySQL选择查询中执行此操作?

感谢。

7 个答案:

答案 0 :(得分:42)

查看MySQL中的TIMESTAMPDIFF()函数。

这允许你做的是传递两个TIMESTAMPDATETIME值(甚至DATE,因为MySQL将自动转换)以及你想要的时间单位根据你的差异。

您可以在第一个参数中指定MONTH作为单位:

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

它基本上获取参数列表中从第一个日期开始经过的月数。该解决方案考虑了每个月(28,30,31)和闰年的不同天数。


如果你想要经过几个月的小数精度,那就更复杂了,但是你可以这样做:

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
  )

startdateenddate是您的日期参数,无论是来自表格中的两个日期列还是来自脚本的输入参数:

示例:

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

答案 1 :(得分:8)

这可行:

SELECT 12 * (YEAR(DateOfService) 
              - YEAR(BirthDate)) 
       + (MONTH(DateOfService) 
           - MONTH(BirthDate)) AS months 
FROM table

答案 2 :(得分:3)

试试这个:

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

答案 3 :(得分:2)

尝试

  

PERIOD_DIFF(P1,P2)

返回期间P1和P2之间的月数。 P1和P2的格式应为YYMMYYYYMM。请注意,句点参数P1和P2不是日期值。

  

的MySQL> SELECT PERIOD_DIFF(200802,200703);            - > 11

答案 4 :(得分:1)

TIMESTAMPDIFF(MONTH, Start_date, End_date)

示例:

SELECT TIMESTAMPDIFF(MONTH, BirthDate, DateOfService) AS Months FROM Table

答案 5 :(得分:1)

基于所有答案和Google搜索的摘要,我认为有四种几乎相似的方式来编写它:

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

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

答案 6 :(得分:0)

“正确”的答案取决于您的需求。我喜欢四舍五入到最接近的整数

考虑以下示例: 1月1日 - &gt; 1月31日:整整0个月,差不多1个月。 1月1日 - &gt; 2月1日?它整整一个月,恰好是一个月。

要获得整个个月的数量,请使用:

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

要在几个月内获得舍入持续时间,您可以使用:

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

准确度为+/- 5天,范围超过1000年。 Zane的答案显然更准确,但我的喜好太过冗长。