我正在尝试创建一个函数,它给出了两个日期之间的四分之一作为整数。传递给函数的日期通常是季度结束日期,有时候其中一个日期只是一个仲裁日期。
基本上我想让它弄清楚这两个日期的四分之一,并给出四分之一的整数差异。
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
我们可以看到日期是在一个季度结束后的一个月内我们没有得到正确的答案。
有人可以提出改进吗?
答案 0 :(得分: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加到结果的整数部分来创建快速且脏的“quarter”函数。假设1月= 1,12月= 12,Q1 = 1月到3月。如果Q1从其他地方开始,例如7月,您将不得不进行调整。
Q = (int)(month - 1)/3 + 1
or
Q = ceiling(month/3)
答案 1 :(得分:1)
这是我选择的{感谢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);
}
答案 2 :(得分:0)
:
SELECT (year('2016-06-30') - year('2015-07-01'))*4 + quarter('2016-06-30') - quarter('2015-07-01') + 1