Jump to content

Подсчет колва месяцев в заданном периоде (PHP / SQL)


Recommended Posts

Честно говоря, я в программировании совсем туп :) и начал изучать php/mysql недавно.

Столкнулся тут с задачей, которую никак не могу придумать как решить:

 

SELECT DATE_FORMAT(date_add, "%b") as m,  round(sum((`total_paid_real` - `total_products` + `total_shipping`) /1000)) as z
FROM `ПРЕФИКС_orders`
where `valid` = 1
group by month(`date_add`)

 

Этот запрос вычисляет прибыль и группирует результаты по месяцам. Делает он это за все время работы.

 

Нужно подсчитать СРЕДНЮЮ прибыль в каждом месяце, для чего каким-то образом нужно вычислить количество месяцев между датой запуска магазина и NOW().

 

Каким? :) Сколько например июней было с (например) 20100401 и 2013801? Я ниасилил ни на php, ни на sql :(

Edited by gluck (see edit history)
Link to comment
Share on other sites

Похоже что нет :(

Там в задаче есть максимально допустимое количество... не знаю как объяснить :) в общем нам ни с чем сравнивать не нужно.

Link to comment
Share on other sites

опиши точнее задачу я попробую решить.

 

Похоже что нет :(

Там в задаче есть максимально допустимое количество... не знаю как объяснить :) в общем нам ни с чем сравнивать не нужно.

Edited by absent (see edit history)
Link to comment
Share on other sites

А все просто :) В результате выполнения скрипта из верхнего поста получается вот такая табличка:

 

post-440734-0-94171300-1375559530_thumb.jpg

 

Вторая колонка это тупо прибыль, полученная с магазина за все январи, все феврали итд. Задача — вычислить СРЕДНЮЮ прибыль в каждом месяце. Для чего число из второй колонки нужно тупо разделить на количество соответствующих месяцев.

 

Но если бы магазин запустился в январе — нет проблем: sum(now() - 'год запуска'), но его угораздило запуститься в апреле... сталбыть по состоянию на сегодняшний день февралей в истории магазина было на один меньше, чем июлей... :)

Link to comment
Share on other sites

Буду премного "ку" :)

А разве не существует некой специальной команды в том же sql например... задача-то вроде как элементарная, всем нужна :)

Link to comment
Share on other sites

Буду премного "ку" :)

А разве не существует некой специальной команды в том же sql например... задача-то вроде как элементарная, всем нужна :)

 

я не встречал такого

Link to comment
Share on other sites

  • 4 weeks later...

Вроде бы придумал, покритикуйте.

 

Код

$begin = new DateTime( '2010-01-01' ); //дата запуска
$end = new DateTime();
$interval = new DateInterval('P1M');
$daterange = new DatePeriod($begin, $interval ,$end);
$m = array();
foreach($daterange as $date){
array_push($m, $date->format("M"));
}
print_r (array_count_values($m));

 

Результат

Array
(
[Jan] => 4
[Feb] => 4
[Mar] => 4
[Apr] => 4
[May] => 4
[Jun] => 4
[Jul] => 4
[Aug] => 4
[sep] => 3
[Oct] => 3
[Nov] => 3
[Dec] => 3
)

В реальном скрипте используются номера месяцев с ведущим нолем, то есть

$date->format("m")

Edited by gluck (see edit history)
Link to comment
Share on other sites

SELECT DATE_FORMAT(date_add, "%b") as m,  round(sum((`total_paid_real` - `total_products` + `total_shipping`) /1000)) as z, count(month(`date_add`)) as mount_count
FROM `ПРЕФИКС_orders`
where `valid` = 1
AND date_add BETWEEN '2013-08-01' AND '2011-08-01'
group by month(`date_add`)

 

У вас же данные группируются по месяцам, значит можно посчитать сколько в каждой группе месяцев

Edited by sors (see edit history)
Link to comment
Share on other sites

×
×
  • Create New...