嗨,stackoverflow 的好心人!
我希望此查詢可以檢查兩個日期之間是否有房間(朗姆酒,瑞典語)。但是,我希望查詢首先檢查房間是否已退房,否則使用 fDatum AND tDatum。如果房間已經被簽出,那么它應該使用 fDatum 和 checkUt。
在資料庫中,我們存盤房間的預訂時間(fDatum,tDatum),以及房間入住和退房的日期(checkIn,checkUt)。
編輯:輸出將顯示在 2021-10-12 和 2021-10-14 之間未預訂的房間的房間號,以及房間型別(單人、雙人、家庭)。
您將在下面找到正在使用的代碼。但如果客人早于 2021 年 10 月 12 日退房,如果房間是在 2021 年 10 月 12 日之前預訂的,則該房間可能仍會顯示為已預訂。客人仍然必須支付2021-10-12的房間費用,但如果客人提前退房,酒店希望能夠出租房間。
Select rumNr, rumTyp
From Rum
Where RumNr NOT IN (Select RumNr
From BokningRum
Where fDatum BETWEEN '2021-10-12' AND '2021-10-14'
OR tDatum BETWEEN '2021-10-12' AND '2021-10-14')
GROUP BY rumNr
;
所以我希望代碼像這樣作業:
Select rumNr, rumTyp
From Rum
Where RumNr NOT IN (Select RumNr
From BokningRum
Where fDatum BETWEEN '2021-10-12' AND '2021-10-14'
OR checkUt BETWEEN '2021-10-12' AND '2021-10-14')
-- If checkUt is null, then do
-- Where fDatum BETWEEN '2021-10-12' AND '2021-10-14'
-- OR tDatum BETWEEN '2021-10-12' AND '2021-10-14')
GROUP BY rumNr
;
uj5u.com熱心網友回復:
Select rumNr, rumTyp
From Rum
Where RumNr NOT IN (
Select RumNr
From BokningRum
Where
case when !isnull(checkUt) then
fDatum BETWEEN '2021-10-12' AND '2021-10-14'
OR tDatum BETWEEN '2021-10-12' AND '2021-10-14'
else
fDatum BETWEEN '2021-10-12' AND '2021-10-14'
end
)
GROUP BY rumNr;
uj5u.com熱心網友回復:
感謝@Guram,我設法解決了它。我知道我的解釋不是很好,但非常感謝大家的幫助。這是最終的查詢,將為我贏得這些額外的分數。
再次感謝!
Select rumNr, rumTyp
From Rum
Where RumNr NOT IN (
Select RumNr
From BokningRum
Where
case when checkUt<tDatum then
(fDatum BETWEEN '2021-10-12' AND '2021-10-14'
OR checkUt BETWEEN '2021-10-12' AND '2021-10-14')
else
( fDatum BETWEEN '2021-10-12' AND '2021-10-14'
OR tDatum BETWEEN '2021-10-12' AND '2021-10-14')
end
)
GROUP BY rumNr;
輸出將是可用于預訂這些日期的房間。
rumNr,rumTyp
1,Enkel
2,Enkel
3,Enkel
4,Enkel
5,Enkel
6,Enkel
7,Enkel
8,Enkel
9,Enkel
10,Enkel
11,Dubbel
12,Dubbel
13,Dubbel
14,Dubbel
16,Dubbel
17,Dubbel
18,Dubbel
19,Dubbel
20,Dubbel
21,Dubbel
23,Dubbel
25,Dubbel
26,Dubbel
27,Dubbel
28,Dubbel
29,Dubbel
30,Dubbel
31,Familje
32,Familje
uj5u.com熱心網友回復:

上面 #2 建議的 SQL 的結果:

原始 SQL 的結果,假設 rumNr 是PRIMARY KEYin Rum:

Notice rumNr = 7 in the result.
Your original SQL, with GROUP BY removed, with the assumption that rumNr is unique or the primary key of Rum.
Select rumNr, rumTyp
From Rum
Where RumNr NOT IN (
Select RumNr
From BokningRum
Where
case when checkUt<tDatum then
( fDatum BETWEEN '2021-10-12' AND '2021-10-14'
OR checkUt BETWEEN '2021-10-12' AND '2021-10-14')
else
( fDatum BETWEEN '2021-10-12' AND '2021-10-14'
OR tDatum BETWEEN '2021-10-12' AND '2021-10-14')
end
)
-- GROUP BY rumNr
;
The setup:
CREATE TABLE Rum (rumNr int, rumTyp VARCHAR(10));
CREATE TABLE BokningRum (RumNr int, fDatum DATE, tDatum DATE, checkUt DATE);
INSERT INTO Rum VALUES
( 1, 'type1')
, ( 2, 'type1')
, ( 3, 'type1')
, ( 4, 'type1')
, ( 5, 'type1')
, ( 6, 'type1')
, ( 7, 'type1')
, ( 8, 'type1')
, ( 9, 'type1')
, (10, 'type1')
, (30, 'type2')
;
INSERT INTO BokningRum VALUES
( 1, '2021-10-12', '2021-10-14', null)
, ( 2, '2021-10-12', '2021-10-14', '2021-10-13')
, ( 3, '2021-10-12', '2021-10-14', '2021-10-14')
, ( 4, '2021-10-12', '2021-10-14', '2021-10-15')
, ( 5, '2021-10-11', '2021-10-13', null)
, ( 6, '2021-10-13', '2021-10-13', null)
, ( 7, '2021-10-11', '2021-10-15', null)
, (10, '2021-10-08', '2021-10-12', null)
;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/327975.html
