我在mysql中有一个表,它包含一个开始和结束日期。这些开始和结束日期适用于预订酒店的情况。我需要做的是显示一个日历,显示预订的日期和当月可用的日期。我怎样才能知道当月预订的天数?我可以循环浏览当月的每一天,但这意味着30或31个查询,是否有更好,更优化的方式来查找本月预订的天数,以便我可以在日历上对日期进行颜色编码?
表结构如下:
hotelid int(11)
startdate(日期)
enddate(date)
查询请求:
SELECT * FROM hotel_book WHERE hotelid = 1 AND DATE_FORMAT(startdate,'%Y-%m') >= '2012-08' AND DATE_FORMAT(enddate,'%Y-%m') <= '2012-08'
我确定我可以通过它2012-08-01和2012-08-31所以我不在每张支票上处理日期格式。但仅仅是出于示例目的。
答案 0 :(得分:2)
另一种方法是允许您的日历接受开始日期和结束日期,并呈现在日历逻辑中预订的每一天。如果日历使用javascript而不是PHP或MySQL对您的服务器的影响将是最小的。无论哪种方式,你最终都会循环,它只取决于你想要发生的地方。
答案 1 :(得分:0)
首先获取酒店身份证。然后执行查询以获取与该酒店ID相对应的所有开始日期和结束日期。我建议你有第二个字段来计算差异:
如果有人预订了第1到第3,那么第2个也会被预订,所以你必须创建一个计算差异的函数,然后输出'在'之间'字段。所以它必须首先得到起始编号,然后每次增加+1天直到结束日期。所以它最终会像数组(1,2,3)
然后你可以把这个信息放到一个预订的数组中,用于jquery或ajax日历(很多在线提供)。据推测,一旦约会日期,就不能再次预订,否则你会有1,2,3的重复值 - 所以我猜这家酒店只有一个房间可用或其他什么。
答案 2 :(得分:0)
以下是获取所需日期的代码。您可以在日历上显示有关其逻辑的信息。 请注意,我使用自定义类进行数据库选择。
$id=$_POST['id'];
$days=$db->select("reservations","room_id=".$id);
$listofdays=array();
foreach ($days $day) {
$start=$day['start'];
$end=$day['end'];
$liste=array(); //This array will be filled with dates between start and end
$liste=date_range($start, $end, $step = '+1 day', $output_format = 'm-d-Y' );
foreach ($liste as $key => $list) {
$listofdays[] = $list;
}
}
// date_range函数如下:
function date_range($first, $last, $step = '+1 day', $output_format = 'm/d/Y' ) {
$dates = array();
$current = strtotime($first);
$last = strtotime($last);
while( $current <= $last ) {
$dates[] = date($output_format, $current);
$current = strtotime($step, $current);
}
return $dates;
};