我有几个月前推出的网站。我想编写一些代码,每个月都会查看,自启动以来,并抓住该月的指标。
我的问题是:指定开始日期,然后按月迭代,一直到当前月份(或另一个指定日期)的最佳方法是什么。
有没有人有任何建议?我正在使用PHP和mySQL数据库。
答案 0 :(得分:6)
您可以使用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&gt; = 5.3.0,则可以将DateTime::add
与DateInterval
对象一起使用
检查上面的示例here。
答案 1 :(得分:1)
$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)
,这很可能会更快。
答案 2 :(得分:1)
我不知道您存储的指标的架构,所以这是一个通用示例:
从8月1日至2009年11月30日选择每月的总浏览量
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循环它并执行其他操作。
答案 3 :(得分:1)
我有一个结果最佳的方法:
$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" ));
}
希望这会有所帮助。
答案 4 :(得分:0)
如果您从30个月的最后一天开始,您可能会在使用“+1个月”之间失去一个月。请尝试从2015-06-30到2015-12-31,例如,它将跳过2015年9月。
我建议使用“下个月的第一天”,而不是使用“+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年9月。