【问题标题】:How to iterate, by month, between two specified dates如何在两个指定日期之间按月迭代
【发布时间】:2010-12-27 22:37:41
【问题描述】:

我有一个几个月前推出的网站。我想编写一些代码,自发布以来每个月都会查看,并获取该月的指标。

我的问题是:指定开始日期的最佳方式是什么,然后按月迭代,一直到当前月份(或另一个指定日期)。

有人有什么建议吗?我正在使用 PHP 和一个 mySQL 数据库。

【问题讨论】:

    标签: php mysql sql datetime


    【解决方案1】:

    您可以使用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::addDateInterval 对象

    查看上面的例子here

    【讨论】:

      【解决方案2】:
      $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),这很可能会更快。

      【讨论】:

        【解决方案3】:

        我不知道您存储的指标的架构,所以这是一个通用示例:

        选择 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 循环并执行其他操作。

        【讨论】:

        • 感谢您提供有关 MySQL 的信息。我仍在学习很多关于它的工作原理以及如何进行更高级查询的知识。
        • 不客气,贾斯汀。学习如何让数据库在高效/有效的情况下完成繁重的工作绝对值得花时间深入研究。
        【解决方案4】:

        我有一个结果最佳的方法:

        $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" ));
        }
        

        希望这会有所帮助。

        【讨论】:

        • php DatePeriod 和 DateInterval 的最佳答案!
        【解决方案5】:

        如果您从 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 月。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-02-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-28
          • 2011-01-01
          • 2011-06-06
          相关资源
          最近更新 更多