2011-04-12 98 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的回答顯然更準確,但對我的喜好來說太冗長了。