2

我正在开发一个酒店房间预订系统,那里只有 5 个房间。如果已经完成 5 个或更多预订,我想获取日期期间。

例子:

+-------------------------------------------------------------+
|Booking_from_date | Booking_to_date | Number_of_booking_rooms|
+------------------+-----------------+------------------------+
| 2013-01-01       | 2013-01-10      | 3                      |
+------------------+-----------------+------------------------+
| 2013-01-06       | 2013-01-15      | 2                      | 
--------------------------------------------------------------- 

(现在在2013-01-06 到 2013-01-10之间总共预订了 5 个房间,所以我想得到这个日期)。

我尝试使用 MySql,但还没有实现。是否可以创建这样的查询?

4

2 回答 2

2

可能有另一种更简单的方法,但我能想到的是将日子分开并将其分组以得到总和。

select date_add(a.booking_from_date, interval col1 day), 
sum(Number_of_booking_rooms) from 
(select * from table1)a,
(select 0 col1 union all
select 1 col1 union all
select 2 union all
select 3 union all
select 4 union all
select 5 union all
select 6 union all
select 7 union all
select 8 union all
select 9) b 
where date_add(a.booking_from_date, interval col1 day) <= a.booking_to_date
group by date_add(a.booking_from_date, interval col1 day)
having sum(Number_of_booking_rooms) >= 5

http://sqlfiddle.com/#!2/87813/15

这是我得到的结果。

DATE                            SUM
January, 06 2013 00:00:00+0000  5
January, 07 2013 00:00:00+0000  5
January, 08 2013 00:00:00+0000  5
January, 09 2013 00:00:00+0000  5
January, 10 2013 00:00:00+0000  5
于 2013-09-03T13:03:15.767 回答
1

这不可能仅通过 MySql 查询来实现。但是我有一个使用循环的解决方案。请检查此代码,您将获得所需的输出。

         /* all active booking from mysql table. */
        $this -> data['booked_dates'] = $this -> admin_model -> get_booked_dates_from();//(just a function to get all dates from table)



        $array_index = 0;
        $not_available_date_range = array();
        //declaration

        $not_available_date = array();

        foreach ($this -> data['booked_dates'] as $key => $booked_date)// loop for each booking dates(each table row).
        {
            //flag to know package is to be blocked or not...
            $block_status = 0;

            $check_in_min_date = 0;
            $check_out_max_date = 0;

            $strDateFrom = $booked_date -> check_in_date;
            $strDateTo = $booked_date -> check_out_date;

            // Takes two dates, formatted in YYYY-MM-DD.
            // Inclusive array of the dates between the from and to dates.

            $aryRange = array();
            $iDateFrom = strtotime($strDateFrom);
            $iDateTo = strtotime($strDateTo);
            if ($iDateTo >= $iDateFrom)//just a validation
            {
                array_push($aryRange, date('Y-m-d', $iDateFrom));
                // first entry
                $date_gap = 0;
                while ($iDateFrom <= $iDateTo)//select each date...between check-in date and check-out date. one by one
                {

                    $date_gap++;
                    $booking_count = 0;

                    for ($i = $key; $i <= (count($this -> data['booked_dates']) - 1); $i++)// loop for each booking. // loop have to reduce size. by using good logic..:)
                    {

                        $strDateFrom2 = strtotime($this -> data['booked_dates'][$i] -> check_in_date);
                        $strDateTo2 = strtotime($this -> data['booked_dates'][$i] -> check_out_date);
                        if (($iDateFrom >= $strDateFrom2) && ($iDateFrom <= $strDateTo2))
                        {
                            $booking_count = $booking_count + $this -> data['booked_dates'][$i] -> rooms;

                        }
                    }

                    if ($booking_count >= 5)// compare with maximum available rooms.
                    {
                        $block_status = 1;
                        //room should be blocked.
                        if ($check_in_min_date == 0)
                        {
                            $check_in_min_date = $iDateFrom;
                            $check_out_max_date = $iDateFrom;
                            //For if only one day is going to block.
                        }
                        else
                        {

                            $check_out_max_date = $iDateFrom;
                            //datefrom is incremented till the maximum booked date.
                        }

                        array_push($not_available_date, date('Y-m-d', $iDateFrom));
                    }
                    $iDateFrom += 86400;
                    // add 24 hours

                }

            }
            else
            {
                echo 'Wrong input!';
            }
            if ($block_status)//if the room is blocked..
            {

                $not_available_date_range[$array_index]['check_in_date'] = date('Y-m-d', $check_in_min_date);
                $not_available_date_range[$array_index]['check_out_date'] = date('Y-m-d', $check_out_max_date);
                $array_index++;
            }
        }

        $this -> data['blocked_dates'] = $not_available_date_range; // Now we have booking period where more than 5 bookings are done.
于 2013-09-03T13:22:27.893 回答