【发布时间】:2010-12-27 22:37:41
【问题描述】:
我有一个几个月前推出的网站。我想编写一些代码,自发布以来每个月都会查看,并获取该月的指标。
我的问题是:指定开始日期的最佳方式是什么,然后按月迭代,一直到当前月份(或另一个指定日期)。
有人有什么建议吗?我正在使用 PHP 和一个 mySQL 数据库。
【问题讨论】:
我有一个几个月前推出的网站。我想编写一些代码,自发布以来每个月都会查看,并获取该月的指标。
我的问题是:指定开始日期的最佳方式是什么,然后按月迭代,一直到当前月份(或另一个指定日期)。
有人有什么建议吗?我正在使用 PHP 和一个 mySQL 数据库。
【问题讨论】:
您可以使用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 对象
查看上面的例子here。
【讨论】:
$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,则可以在 DB 中获取所有指标和 GROUP BY EXTRACT(YEAR_MONTH FROM date),这很可能会更快。
【讨论】:
我不知道您存储的指标的架构,所以这是一个通用示例:
选择 2009 年 8 月 1 日至 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 循环并执行其他操作。
【讨论】:
我有一个结果最佳的方法:
$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" ));
}
希望这会有所帮助。
【讨论】:
如果您从 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 月。
【讨论】: