我正在做一個關於酒店預訂的項目,因爲我必須在頁面中顯示選定周的房間空房間。我正在從酒店預訂表中抽取預定房間數以下是預訂表中的少數行爲。選擇基於當前日期的日期範圍之間的行數
我的問題是我得hb_chkDt和選擇一週各日hb_chkoDt之間HB_Noofrooms的總和。
ex。假設如果我採取當前日期並檢查它,那麼我必須得到2作爲總和。
請幫我解決這個問題。
我正在做一個關於酒店預訂的項目,因爲我必須在頁面中顯示選定周的房間空房間。我正在從酒店預訂表中抽取預定房間數以下是預訂表中的少數行爲。選擇基於當前日期的日期範圍之間的行數
我的問題是我得hb_chkDt和選擇一週各日hb_chkoDt之間HB_Noofrooms的總和。
ex。假設如果我採取當前日期並檢查它,那麼我必須得到2作爲總和。
請幫我解決這個問題。
如果你會通過日期作爲參數,你需要得到空位然後它的簡單查詢:
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
此查詢不會選擇任何內容,因爲在示例HB_ChkODt> HB_ChkDt中,需要更改操作員的方向 –
@MaxZerbini:對不起,這是我在操作員中的錯誤:)。我已經更新了答案。 –
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)
如果你想以檢索在一個星期內佔領客房總數:
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()
你會通過你需要空缺的日期嗎? –
我正在使用存儲過程來創建返回table.i將只給出開始date.in,我將加1臨時date.using這個臨時日期我正在搜索預訂表 –
如果您使用存儲過程,那麼你可以得到多個日期的空缺,就像在我更新的答案中一樣。 –