2013-07-15 1 views
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

Мы можем видеть 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 

Используйте абсолютное значение результата, чтобы получить число разницы кварталов.

Вы можете создать быструю и грязную функцию «четверть», разделив месяц-1 на 3 и добавив 1 к целой части результата. Предполагая, что январь = 1, декабрь = 12 и Q1 = с января по март. Вы должны будете внести коррективы, если Q1 начинается в другом месте, например, в июле.

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

Я считаю месяц-> квартал лучше выражено 'ceil ($ month/3)' – harryg

+0

Конечно. Существует несколько способов получить его. Какой бы ни был яснее вам. (Я опечатал 3/4, исправил его в редактировании). – Maple

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); 
} 
0

в MYSQL:

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