PHP:开始日期-结束日期范围(按月份)

PHP:开始日期-结束日期范围(按月份),php,mysql,Php,Mysql,好的,我这里有一个逻辑问题,比编码问题更重要,但是一个代码示例/解决方案可能会同时回答这两个问题,所以接下来 如果我有一个在PHP中传递的表单,它的开始日期和结束日期都是m/d/Y格式,我需要打印一个mysql数据库中所有条目的表,这些条目都在这个范围内,从m1/d1/Y1到m2/d2/Y2,按月份分组,我该如何以优雅的方式进行呢 例如,如果我通过start_date=2012年5月20日,end_date=2012年7月31日,我需要生成的表格以这种格式显示结果: May 2012 | J

好的,我这里有一个逻辑问题,比编码问题更重要,但是一个代码示例/解决方案可能会同时回答这两个问题,所以接下来

如果我有一个在PHP中传递的表单,它的开始日期和结束日期都是m/d/Y格式,我需要打印一个mysql数据库中所有条目的表,这些条目都在这个范围内,从m1/d1/Y1到m2/d2/Y2,按月份分组,我该如何以优雅的方式进行呢

例如,如果我通过start_date=2012年5月20日,end_date=2012年7月31日,我需要生成的表格以这种格式显示结果:

May 2012  |  June 2012  |  July 2012
....      |  ....       |  .....
其中2012年5月的第一列将显示mysql查询的结果,如

SELECT ... WHERE signup_date >= 5/20/2012 AND signup_date <= 5/31/2012
2012年6月也将类似地显示:

SELECT ... WHERE signup_date >= 6/1/2012 AND signup_date <= 6/30/2012

因此,我正在寻找一种方法,将开始日期和结束日期解析为一系列日期,这些日期从月的开始日期到月的最后一天进行适当安排,如果结束日期晚了几个月,则从该月的第一天到最后一天,将这两个月之间的所有其他月份全部覆盖,这样我就可以在for/while循环中遍历它们了?比如:

[0]['start']=>“2012年5月20日”

[0]['end']=>“2012年5月31日”

[1] ['start']=>“2012年6月1日”

[1] ['end']=>“2012年6月30日”

[2] ['start']=>“2012年7月1日”

[2] ['end']=>“2012年7月31日”

有什么想法吗?

试试这个:

$date = '5/20/2012';
$dateStart = date("m/01/y", strtotime($date));

$start = date("Y-m-d", strtotime($dateStart));
$end = date("Y-m-d", strtotime($dateStart. '+ 1 month - 1 day') );

echo $start;
echo $end;

关于mysql db日期格式,请先看我的评论

用伪语言写的

     $sql="SELECT * FROM ... WHERE `signup_date`>='2012-5-20' AND `signup_date`<'2012-5-31' ORDER BY  `signup_date`";


        $result=mysql_query($sql);

    $month_year=array() //3-dimensional array $month_year[year][month][primary_key];

    $month_index=-1;
    while($row=mysql_fetch_assoc($result)){

    // find $month_of_the_date AND $year_of_the_date

    //find different months ,corresponding years, and db primary key and keep track in the $month_year array




    }

    for( all the years in the array ){

    for(all the corresponding months of the year  in the array){

//**EDIT:** you MIGHT need other loops and arrays to collect distinct years and corresponding months together

    // show the records with the primary keys corresponding to that month and year



    }




    }

你应该努力做到这一点。下面是示例代码

<?php
$startDate = '05/20/2012';
$endDate = '07/31/2012';


$curMonth =  date("m", strtotime($endDate)); //End Month
$curYear = date("Y", strtotime($endDate)); //End Year

$months = array();
$months[] = array('start' => "$curMonth/01/$curYear", 'end' => $endDate);

while ("$curMonth/01/$curYear" > $startDate) {
        $monthEnd =  date("m/d/Y", mktime(0, 0, 0, $curMonth, 0, $curYear));
        $curMonth = date('m', strtotime($monthEnd));
        $curYear = date('Y', strtotime($monthEnd));
        $monthStart = ($curMonth/01/$curYear > $startDate) ? $startDate : "$curMonth/01/$curYear";
        $months[] = array('start' => $monthStart, 'end' => $monthEnd);
}

print_r(($months));
?>

mysql以Y-m-d格式而不是d-m-Y格式保存日期记录。不管怎样,我可以以任何可能的方式对其进行格式化和重新格式化,所以这与此无关。。。如果这能让事情变得容易些,假设所有日期都是以Y-m-d格式传递的。这将如何显示相应年份不同月份的记录?这就是您获取sql开始和结束日期的方式。如果您在sql中使用“按月分组记录日期”会怎么样?从表中选择*,其中“注册日期>=”2012-5-20“和“注册日期”非常有用。但首先,第一个分组应该以年为基础,而不是以月为基础。