Как перебрать по месяцам между двумя указанными датами - PullRequest
2 голосов
/ 18 декабря 2009

У меня есть сайт, который был запущен несколько месяцев назад. Я хотел бы написать код, который будет просматриваться каждый месяц с момента запуска, и получать метрики за этот месяц.

Мой вопрос таков: как лучше всего указать начальную дату, а затем выполнить итерации по месяцам вплоть до текущего месяца (или до другой указанной даты).

У кого-нибудь есть предложения? Я использую PHP и базу данных MySQL.

Ответы [ 5 ]

6 голосов
/ 18 декабря 2009

Вы можете использовать strtotime, чтобы увеличить дату на +1 month:

$date1 = strtotime('2009-01-01');
$date2 = strtotime('2010-01-01');

while ($date1 <= $date2) {
  echo date('Y-m-d', $date1) . "\n";
  $date1 = strtotime('+1 month', $date1);
}

А если у вас PHP> = 5.3.0, вы можете использовать DateTime::add с DateInterval объектом

Проверьте приведенный выше пример здесь .

1 голос
/ 05 сентября 2014

У меня есть метод, который оптимален в результатах:

$begin = new DateTime( '2014-07-14' );
$end = new DateTime( '2014-08-01' );
$end = $end->modify( '+1 month' );
$interval = DateInterval::createFromDateString('1 month');

$period = new DatePeriod($begin, $interval, $end);

foreach($period as $dt) {
    var_dump($dt->format( "m" ));
}

Надеюсь, это поможет.

1 голос
/ 18 декабря 2009

Я не знаю схему ваших сохраненных метрик, поэтому вот общий пример:

Выберите общее количество просмотров страниц в месяц с 1 августа по 30 ноября 2009

Код для MySQL:

SELECT DATE_FORMAT(s.date, '%Y-%m') AS  year_month , SUM( s.pageviews ) AS  s.pageviews_total 
FROM statistics s
WHERE s.date BETWEEN '2009-08-01' AND '2009-11-30'
GROUP BY DATE_FORMAT(s.date, '%Y-%m') 
ORDER BY DATE_FORMAT(s.date, '%Y-%m')

Вам может хватить этой агрегированной таблицы. Если нет, вы можете пройти через него с помощью PHP и выполнять другие манипуляции.

1 голос
/ 18 декабря 2009
$start_date = mktime(0, 0, 0, 1, 1, 2009);
$end_date = mktime(0, 0, 0, 10, 1, 2009);

$current_date = $start_date;
while($current_date <= $end_date) {
     $current_date = strtotime("+1 month", $current_date);
}

Это один из способов сделать это. Еще одна включает две петли по месяцам и годам отдельно.

Но если вы хорошо знаете SQL, вы можете получить все свои метрики и GROUP BY EXTRACT(YEAR_MONTH FROM date) прямо в БД, что, скорее всего, будет быстрее.

0 голосов
/ 23 июля 2015

Если вы начинаете с последнего дня 30-дневного месяца, вы можете потерять несколько месяцев в промежутке между использованием "+1 месяц" Попробуйте, например, с 2015-06-30 по 2015-12-31, сентябрь 2015 будет пропущен.

Вместо того, чтобы использовать «+1 месяц», я предлагаю вместо этого использовать «первый день следующего месяца»:

$begin = new DateTime( '2015-06-30' );
$end = new DateTime( '2015-12-31' );
$end = $end->modify( 'first day of next month' );
$interval = DateInterval::createFromDateString('first day of next month');

$period = new DatePeriod($begin, $interval, $end);

foreach($period as $dt) {
    var_dump($dt->format( "m" ));
}

это также будет список в сентябре 2015 года.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...