복붙노트

[SQL] SQL 쿼리는 객실 가용성을 검색합니다

SQL

SQL 쿼리는 객실 가용성을 검색합니다

내가 가진 후속 테이블은 다음과 같습니다 :

 CUSTOMERS (CustomerID, firstname, surname etc)
 ROOMS (RoomID, RoomType, Description)
 BOOKING (BookingID, CustomerID, Arrival Date, Departure Date, number of people, total cost)
 ROOMS_BOOKED (BookingID, RoomID)

사용자는 두 날짜의 도착과 출발 일자를 입력합니다. 객실 가용성 그리고 확인합니다. 나는 데이터베이스에 자신을 삽입 한 순간에 예약 한 방은있다. 예약 테이블은 이제 BookingID = 1, CustomerID를 = 1, 도착 일 = 24/03/2015, 출발 날짜 = 26/03/2015, 사람들 = 1, 총 비용 = 40.00의 수를 포함하고 그래서. 그런 다음 스탠다드 룸입니다 ROOMS_BOOKED 테이블 I 유무 BookingID = 1, RoomID = 2인치

나는이 SQL 코드를 사용하고 있습니다 -

   SELECT RoomType FROM ROOMS WHERE RoomID NOT IN (SELECT RoomID FROM ROOMS_BOOKED) 

이 쿼리는 예약되지 않은 객실을 반환하지만, 임이 찾고있는 사람이되지 않는 것. 예를 들어 사용자가 데이터베이스에 예약 동일 날짜를 선택합니다. 그래서 저는, www.galgorm.com과 비슷한 무언가를 다음 페이지의 모든 객실 유형을 표시하고 그 선택된 날짜에 예약되어있는 특정 유형의 객실에 대한 X 또는 무언가를 표시 할 수 있어야합니다.

나는이 도움을 필요로 매번 내가 대답이나 도움의 형태를 결코 이것에 대해 질문을 게시 할 수 있습니다. 나는 지금 그것을 마무리 할 수 ​​있도록하려면, 지금까지 디자인이 호텔의 시스템을 가지고있다.

제발 도와주세요, 물론 때로는 같은 상황 필요한 도움에 있었던 메신저.

해결법

  1. ==============================

    1.다음과 같은 경우가

    다음과 같은 경우가

    The user's selected period:
    --------[---------]-------
    Booking no1 
    [-----]-------------------
    Booking no2
    --------------------[----]
    Booking no3
    -----[----]---------------
    Booking no4
    -----------[---]----------
    Booking no5
    ------[-------]-----------
    Booking no6
    --------------[--------]--
    Booking no7
    -----[----------------]---
    

    당신은 기간이 교차하는 찾을해야합니다. 물론 경우 1과 2는 무료입니다. 예약의 시작 날짜 또는 예약의 종료일 중 하나가 사용자의 선택에있는 경우 당신이 검색 할 수있는 쉬운 3,5,6 케이스 잡을 수 있습니다. 사용자의 선택 날짜 중 하나가 예약 사이에있을 것입니다 경우에 당신이 필요 케이스 4, 7 찾을 수 있습니다.

    그래서 다음은 무료로 객실을 찾습니다

    DECLARE @ArrivalDate AS DATETIME
    DECLARE @DepartureDate AS DATETIME
    
    SELECT RoomType 
    FROM ROOMS 
    WHERE RoomID NOT IN 
    (
        SELECT RoomID 
        FROM   BOOKING B
               JOIN ROOMS_BOOKED RB
                   ON B.BookingID = RB.BookingID
        WHERE  (ArrivalDate <= @ArrivalDate AND DepartureDate >= @ArrivalDate) -- cases 3,5,7
               OR (ArrivalDate < @DepartureDate AND DepartureDate >= @DepartureDate ) --cases 6,6
               OR (@ArrivalDate <= ArrivalDate AND @DepartureDate >= ArrivalDate) --case 4
    )
    
  2. ==============================

    2.이 [도착, 출발] 기간 내에서 사용할 수있는 경우이 쿼리 목록 각 방 쇼의 모든 객실과

    이 [도착, 출발] 기간 내에서 사용할 수있는 경우이 쿼리 목록 각 방 쇼의 모든 객실과

    SELECT 
        RoomType,
        case when NOT EXISTS (SELECT RoomID 
                      FROM ROOMS_BOOKED rb 
                      JOIN BOOKING b on b.BookingID = rb.BookingID
                      WHERE rb.RoomID = r.Id 
                        and ArrivalDate < 'param Departure Date here'
                        and DepartureDate > 'param Arrival Date here')
            then 1 else 0 end IsAvailable
    FROM ROOMS r
    
  3. ==============================

    3.여기에 내가 사용할 수없는 객실을 확인하기 위해 사용되는 샘플 쿼리는 쿼리는 사용할 수없는 객실을 반환합니다

    여기에 내가 사용할 수없는 객실을 확인하기 위해 사용되는 샘플 쿼리는 쿼리는 사용할 수없는 객실을 반환합니다

    SELECT roomno FROM tbl_ReservedRooms WHERE ((fromdate BETWEEN @checkindate AND @checkoutdate )
    OR (todate BETWEEN @checkindate AND @checkoutdate)) 
    AND status = 'Active'
    
  4. ==============================

    4.rm.Room_id NOT IN은 ( '$ FROM_DATE'와 '$ TO_DATE') OR ( '$ FROM_DATE'BETWEEN bk.departure_date와 '$ TO_DATE') BETWEEN BK WHERE (bk.arrive_date 예약 구별 Room_id을 선택 룸 Rm의 SELECT * OR (bk.arrive_date < '$ FROM_DATE'AND bk.departure_date> '$ TO_DATE'))

    rm.Room_id NOT IN은 ( '$ FROM_DATE'와 '$ TO_DATE') OR ( '$ FROM_DATE'BETWEEN bk.departure_date와 '$ TO_DATE') BETWEEN BK WHERE (bk.arrive_date 예약 구별 Room_id을 선택 룸 Rm의 SELECT * OR (bk.arrive_date < '$ FROM_DATE'AND bk.departure_date> '$ TO_DATE'))

  5. from https://stackoverflow.com/questions/29213183/sql-query-to-search-for-room-availability by cc-by-sa and MIT license