2011-09-27 4 views
1

호텔 예약 프로젝트를 수행하고 있습니다. 페이지에서 선택한 주 룸의 공석을 표시해야합니다. 예약 된 객실 수를 호텔에서 가져오고 있습니다. 예약 테이블 . 아래 테이블 예약에 몇 가지 feilds입니다.현재 날짜를 기준으로 날짜 범위 사이의 행 수 선택

enter image description here

내 문제는 내가 hb_chkDt 선택한 주에 각 날짜의 hb_chkoDt 사이 HB_Noofrooms의 합계를 얻을 필요가있다.

ex. 내가 현재 날짜를 가져 와서 확인하면, 합계를 2로 잡아야한다고 가정하십시오.

이 문제를 해결할 수 있도록 도와주세요.

+0

결원이 필요한 날짜를 전달합니까? –

+0

저장 프로 시저를 사용하여 반환 table.i를 만들 때 시작 date.in 만 제공합니다. 임시 날짜에 1을 추가합니다.이 임시 날짜를 사용하여 예약 테이블을 검색 중입니다 –

+0

저장 프로 시저를 사용하는 경우 내 업데이트 된 답변 에서처럼 여러 날짜에 공석을 얻습니다. –

답변

1

당신은 당신이 간단한 쿼리의 다음 공석을 얻을 필요가있는 매개 변수로 날짜를 통과 할 경우

SELECT SUM(HB_NoOfRooms) FROM Booking 
WHERE HB_ChkDt <= @PassedDt AND HB_ChkODt >= @PassedDt 

그러나 당신은 날짜의 범위를 통과 한 후 날짜 사이의 모든 날짜 현명한 공석을 얻으려면 복잡한 쿼리를 작성해야합니다.

UPDATE : 코드는 여러 날짜 범위에 대한 공석을 얻을 수 있습니다 :

DECLARE @strSQL NVARCHAR(MAX) 
DECLARE @StartDt DATETIME 
DECLARE @EndDt DATETIME 

CREATE TABLE #Booking (HB_Id INT, HB_ChkDt DATETIME, HB_ChkODt DATETIME, HB_NoOfRooms INT) 

INSERT INTO #Booking VALUES (61, '2011-09-07 13:00:00','2011-09-08 13:00:00',1) 
INSERT INTO #Booking VALUES (67, '2011-09-27 13:00:00','2011-09-28 2:00:00',1) 
INSERT INTO #Booking VALUES (68, '2011-09-27 13:00:00','2011-09-28 2:00:00',1) 
INSERT INTO #Booking VALUES (69, '2011-09-28 13:00:00','2011-09-29 2:00:00',1) 

SET @StartDt = '2011-09-27' 
SET @EndDt = '2011-09-29' 

WHILE @StartDt <= @EndDt 
BEGIN 
    IF @strSQL IS NULL OR @strSQL = '' 
     SET @strSQL = 'SELECT ''' + CAST(CONVERT(VARCHAR(10),@StartDt,102) AS VARCHAR(10)) + ''' AS Dt, ISNULL(SUM(HB_NoOfRooms),0) AS Vacancy FROM #Booking WHERE CONVERT(VARCHAR(10),HB_ChkDt,102) <= ''' + CAST(CONVERT(VARCHAR(10),@StartDt,102) AS VARCHAR(10)) + ''' AND CONVERT(VARCHAR(10),HB_ChkODt,102) >= ''' + CAST(CONVERT(VARCHAR(10),@StartDt,102) AS VARCHAR(10)) + '''' 
    ELSE 
     SET @strSQL = @strSQL + ' UNION ALL SELECT ''' + CAST(CONVERT(VARCHAR(10),@StartDt,102) AS VARCHAR(10)) + ''' AS Dt, ISNULL(SUM(HB_NoOfRooms),0) AS Vacancy FROM #Booking WHERE CONVERT(VARCHAR(10),HB_ChkDt,102) <= ''' + CAST(CONVERT(VARCHAR(10),@StartDt,102) AS VARCHAR(10)) + ''' AND CONVERT(VARCHAR(10),HB_ChkODt,102) >= ''' + CAST(CONVERT(VARCHAR(10),@StartDt,102) AS VARCHAR(10)) + '''' 

    SET @StartDt = DATEADD(D,1,@StartDt) 
END 

EXEC (@strSQL) 
DROP TABLE #Booking 
+0

HB_ChkODt> HB_ChkDt 예제에서 연산자의 방향을 변경해야하기 때문에이 쿼리는 아무 것도 선택하지 않습니다. –

+0

@MaxZerbini : 죄송합니다. 그것은 연산자에서 실수였습니다. :) 대답을 업데이트했습니다. –

1
DECLARE @BeginDate date='2010-01-01' 
DECLARE @EndDate date='2011-01-01' 
; With Dates([Date]) as (
SELECT @BeginDate 
UNION ALL 
SELECT DATEADD(Day,1,Date) FROm Dates 
WHERE Dates.date<@EndDate 
) 
SELECT Dates.Date,(SELECT COUNT(HB_No_Of_Rooms) FROM @MyTable WHERE HB_CkdDT>=Dates.date 
AND HB_ChkODt<=Dates.Date 
GROUP By HB_No_Of_Rooms 
) 
FROM Dates 
OPTION(MAXRECURSION 0) 
1

일주일에 점령 객실의 총 수를 가져 오지하려면 :

select sum(HB_NoOfRooms) from Booking 
where (hb_chkDt >= CONVERT(DATETIME, '2011-09-25 00:00:00') and hb_chkDt < CONVERT(DATETIME, '2011-10-01 00:00:00')) 
or (HB_ChkODt >= CONVERT(DATETIME, '2011-09-25 00:00:00') and HB_ChkODt < CONVERT(DATETIME, '2011-10-01 00:00:00')) 

하는 경우를 오늘 점령 된 총 객실 수를 확인하고 싶습니다.

select sum(HB_NoOfRooms) FROM Booking   
where HB_ChkDt <=SYSDATETIME() AND HB_ChkODt >SYSDATETIME() 
관련 문제