2014-07-16 1 views
0

다른 테이블의 날짜 범위 내에서 모든 날짜를 개별적으로 가져 오는 방법을 알려줄 수 있습니까?SQL 서버의 두 테이블 내에서 날짜 범위를 루프하는 방법

'포함하지 않음 18 및 19'방법 : 예약 테이블 상태가 '점유'의 사용 가능한 중간 날짜 (18,19)로 계산되지 않도록 저장 프로 시저를 다시 작성하려면 어떻게해야합니까?

내가 예약 테이블에 날짜 범위를 가지고 :

CheckInDate (07/16/2014 12:00:00 AM) 
CheckOutDate (07/20/2014 13:00:00 PM) 

RoomNumber  CheckInDate    CheckOutDate    Status 
    204   07/16/2014 12:00:00 AM  07/20/2014 13:00:00 PM  Occupied 

하지만 내 AvailableTest 테이블에 어떤 날짜 범위가 없다. 모든 기록은 개인 날짜입니다. 그러나 Reservation 테이블에는 개별 날짜가 없습니다. 범위가 있으며 해당 날짜 범위와 나의 개별 날짜가 AvailableTest 표와 어떻게 일치합니까?

RoomNumber  CheckInDate    CheckOutDate    Status 
    204   07/16/2014 12:00:00 AM  07/16/2014 13:00:00 PM  Available 
    204   07/17/2014 12:00:00 AM  07/17/2014 13:00:00 PM  Available 
    204   07/18/2014 12:00:00 AM  07/18/2014 13:00:00 PM  Available 
    204   07/19/2014 12:00:00 AM  07/19/2014 13:00:00 PM  Available 
    204   07/20/2014 12:00:00 AM  07/20/2014 13:00:00 PM  Available 

사람이 2014년 7월 24일에 2014년 7월 18일의 범위 내에서 사용 가능한 방을 선택하면

204   07/18/2014 12:00:00 AM  07/18/2014 13:00:00 PM  Available 
    204   07/19/2014 12:00:00 AM  07/19/2014 13:00:00 PM  Available 
    204   07/20/2014 12:00:00 AM  07/20/2014 13:00:00 PM  Available 

더 이상 사용할 수 없습니다해야하지만 밖으로 쿼리 할 때 그들은 단지

을 꺼내
204   07/20/2014 12:00:00 AM  07/20/2014 13:00:00 PM  Available 

및 18 및 19가 여전히 나와 있습니다.

그들은 단지 checkindatecheckoutdate 과 일치하는 것으로 보이므로 18-24 (확인 가능)의 기간 내에 16과 20을 확인합니다. 그들은 18 세와 19 세 또한 몰랐습니다.

는 여기에 당신이 예약 테이블에 행이 없음을 날짜 만의 AvailableTest 테이블에서 행을 얻을 찾고 생각 내 쿼리

select distinct (at.RoomNumber), at.RoomID, '', '', '', '', '', '', at.CheckInDate, at.CheckOutDate 
from AvailableTest at      
    join Room r on r.RoomID = at.RoomID 
    join Reservations res on res.RoomID =r.RoomID where 
    ((at.CheckInDate between '07/18/2014 13:00:00 PM' and '07/24/2014 12:00:00 AM') 
     or (at.CheckOutDate between '07/18/2014 13:00:00 PM' and '07/24/2014 12:00:00 AM')) 
     and at.CheckOutDate not in (SELECT CheckOutDate 
    FROM reservations rs WHERE ((CheckInDate BETWEEN '07/18/2014 13:00:00 PM' AND '07/24/2014 12:00:00 AM') OR (CheckOutDate BETWEEN '07/18/2014 13:00:00 PM' AND '07/24/2014 12:00:00 AM'))) and at.CheckInDate not in (SELECT CheckInDate FROM reservations rs WHERE ((at.CheckInDate BETWEEN '07/18/2014 13:00:00 PM' AND '07/24/2014 12:00:00 AM') OR (at.CheckOutDate BETWEEN '07/18/2014 13:00:00 PM' AND '07/24/2014 12:00:00 AM')))' 
+0

그냥 추측하지만 12 시간 및 24 시간 시계를 섞어 놓은 것처럼 보입니다. 12:00:00 AM 00:00:00입니까? – Ruskin

+0

'AvailableTest' 테이블의 사용법은 무엇입니까? 어떤 데이터를 관리하고 있습니까? –

+0

안녕하세요 Ruskin, 24 시간 범위를 사용합니다. 체크 아웃 시간은 12:00 AM이어야합니다. 따라서 내가 넣는 이유는 –

답변

0

입니다.

SELECT DISTINCT 
    r.RoomNumber, 
    at.RoomID , 
    '' , 
    '' , 
    '' , 
    '' , 
    '' , 
    '' , 
    at.CheckInDate , 
    at.CheckOutDate 
FROM AvailableTest at 
    INNER JOIN Room r 
     ON r.RoomID = at.RoomID 
    INNER JOIN Reservations res 
     ON res.RoomID = r.RoomID 
WHERE at.CheckInDate NOT BETWEEN res.CheckInDate AND res.CheckOutDate 

가용 테스트 테이블에는 몇 가지 디자인 문제가 있습니다. 그것은 하나의 날짜에 대해서만 행이 있지만 당신은 체크인/체크 아웃 열을 가지고있는 것 같습니다. 필요하지 않은 수준의 합병증을 추가하십시오. 저는 호텔 관리 회사에서 10 년간 일하면서이 사실을 압니다.

관련 문제