1

我正在尝试制作一个函数,将两个日期之间的季度数作为整数。传递给函数的日期通常是季度结束日期,除非偶尔有一个日期只是一个任意日期。

基本上我希望它找出两个日期属于哪个季度,并给出季度数的整数差。

例如

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

我们可以看到当日期在一个季度结束后的月份时,我们没有得到正确的答案。

任何人都可以建议改进吗?

4

3 回答 3

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,十二月 = 12 并且第一季度 = 一月到三月。如果第一季度从其他地方开始,例如 7 月,您将不得不做出调整。

Q = (int)(month - 1)/3 + 1
or
Q = ceiling(month/3)
于 2013-07-15T15:20:56.177 回答
2

多亏了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);
} 
于 2013-07-16T08:05:50.217 回答
0

在 MYSQL 中:

SELECT (year('2016-06-30') - year('2015-07-01'))*4 + quarter('2016-06-30') - quarter('2015-07-01') + 1 
于 2017-03-10T19:18:12.720 回答