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