2013-07-15 63 views
1

我正在嘗試使一個函數給出兩個日期之間的季度數作爲整數。傳遞給函數的日期通常是四分之一日期,除非偶爾有一個日期只是一個任意日期。兩個日期之間的區別

基本上我希望它找出兩個日期的哪個季度落入並給出季度數的整數差異。

E.g.

Q1 2013 -> Q2 2013 = 1 
Q1 2013 -> Q4 2013 = 3 
Q2 2012 -> Q2 2013 = 4 
Q4 2012 -> Q1 2013 = 1 

這是我的功能。我意識到它是窮人和沒有返回正確的答案所有的時間,但我希望有人能幫助... ...

function quarter_diff(DateTime $d1, DateTime $d2){ 
    //difference in months 
    $diff = $d1->diff($d2); 

    return ceil((($diff->format('%y') * 12) + $diff->format('%m')+1)/4); 
} 

這裏提琴:http://phpfiddle.org/lite/code/tiw-jx3

我們可以看到theat當日期是在一個季度結束後的月份,我們沒有得到正確的答案。

任何人都可以提出改進?

+0

與功能的主要問題是計算一個月區塊的數目(四捨五入),而不管季度開始/結束。另外,你應該除以3而不是4. – Maple

回答

3

轉換每個日期爲宿舍,然後做數學題,非常喜歡你的第一個例子。 一些快速的僞代碼:

Convert d1 to quarter and year -> d1.quarter and d1.year 
Convert d2 to quarter and year -> d2.quarter and d2.year 
Number of quarters = d1.quarter - d2.quarter + (d1.year - d2.year)*4 

使用結果的絕對值來獲得小區差數。

您可以通過將month-1除以3並將1加到結果的整數部分來創建快速且髒的「季度」函數。假設1月= 1,12月= 12,Q1 = 1月至3月。如果Q1從其他地方開始,如7月份,則必須進行調整。

Q = (int)(month - 1)/3 + 1 
or 
Q = ceiling(month/3) 
+0

我估計month-> quarter更好用'ceil($ month/3)' – harryg

+0

表示。有多種方式來獲得它。無論哪一個最清楚你。 (我打錯了3/4;修改了它。) – Maple

1

這是我在MYSQL選擇了感謝的建議從Maple

function quarter_diff(DateTime $d1, DateTime $d2){ 
    //Returns the number of quarters between two dateTime objects 
    if ($d2 > $d1){ 
     $dtmp = $d1; 
     $d1=$d2; 
     $d2=$dtmp; 
     unset($dtmp); 
    } 
    $d1q = ceil($d1->format('m')/3); 
    $d2q = ceil($d2->format('m')/3); 
    $d1y = $d1->format('y'); 
    $d2y = $d2->format('y'); 

    return $d1q - $d2q + 4*($d1y - $d2y); 
} 
0

SELECT (year('2016-06-30') - year('2015-07-01'))*4 + quarter('2016-06-30') - quarter('2015-07-01') + 1