2011-09-27 77 views
1

我正在做一個關於酒店預訂的項目,因爲我必須在頁面中顯示選定周的房間空房間。我正在從酒店預訂表中抽取預定房間數以下是預訂表中的少數行爲。選擇基於當前日期的日期範圍之間的行數

enter image description here

我的問題是我得hb_chkDt和選擇一週各日hb_chkoDt之間HB_Noofrooms的總和。

ex。假設如果我採取當前日期並檢查它,那麼我必須得到2作爲總和。

請幫我解決這個問題。

+0

你會通過你需要空缺的日期嗎? –

+0

我正在使用存儲過程來創建返回table.i將只給出開始date.in,我將加1臨時date.using這個臨時日期我正在搜索預訂表 –

+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() 
相關問題