2011-04-12 99 views
6

我有一个MySQL表的两列两个日期之间的区别:如何计算个月在MySQL

  • DateOfService(日期时间)
  • 出生日期(日期)

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

我该如何在MySQL select查询中做到这一点?

谢谢。

+0

您能否给您所期望的输出的例子吗?例如:今天是4月12日,我的生日是4月14日或5月12日或5月15日。您希望从查询中获得什么值? – Teetrinker 2011-04-12 10:35:24

+0

重复:http://stackoverflow.com/questions/288984/the-difference-in-months-between-dates-in-mysql – manji 2011-04-12 10:37:37

+0

DateOfService列日期总是会大于出生日期栏。所以我需要从DateOfService中减去BirthDate并计算几个月内的差异。 – Awan 2011-04-12 10:38:02

回答

8

这可能工作:

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

我已经使用此查询..issue出现特定的日期。日期为2014-01-30至2014-03-02仅有30天不等,但是返回2个月差异。 – Vaishu 2014-01-30 08:54:27

+0

@jey:技术上它们是两个个月做好了对方... – Marco 2014-01-30 09:21:41

3

试试这个:

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

40

看一看在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 
+0

嘿,我能够实现上述结果,但我的条件是,我需要0.5年,1年,1.5年,2年,2.5年等..我怎么能这样做! – Dipen 2015-03-03 07:44:28

2

TRY与

PERIOD_DIFF(P1,P2)

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

mysql> SELECT PERIOD_DIFF(200802,200703); - > 11

+0

这不回答这个问题的任择议定书,因为它不接受时间日期格式,甚至日期格式。也许如果这个问题被编辑显示这个,那么我可能会收回我的-1。 – amaster 2013-08-07 15:40:53

0
TIMESTAMPDIFF(MONTH, Start_date, End_date) 

例子:

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

基于所有答案的总结和谷歌搜索,我认为有四个几乎相同的方式来写它:

1)

TIMESTAMPDIFF(MONTH, Start_date, End_date) AS Period 

例如

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 

例如

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 

例如

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** 

例如

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

“正确的”答案取决于您所需要的。我喜欢轮最接近的整数

考虑这些例子: 月1日1至1月> 31:这是全0个月,近1个月之久。 1月1日 - > 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的回答显然更准确,但对我的喜好来说太冗长了。