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 に答える