[英]Get available stables for given period MySQL query
這是SQL小提琴
正確答案應該是864
和871
。
這些應該是正確的答案,因為如果有人在某個日期退房(這意味着該房間在同一天有空),則該答案與酒店相同。
以下是數據庫字段
stable_registrations
| id | user | stableId | checkInDate | checkOutDate |
stables
| id | name |
其中checkinDate
為YYYY-MM-DD
格式。
預期輸出為
Available Stables
864
871
我之所以這樣說是因為它與“酒店預訂”的工作原理相同,其中checkInDate
表示客戶將在當天抵達,並且可以在12:00 PM后簽入,而checkOutDate
意味着客戶在當天11:00 AM或之前離開。
因此,如果checkOutDate
為2017-05-01
,則表示穩定時間為2017-05-01
12:00 PM。
如果我不正確地保存數據,那么請告訴我存儲checkInDate
和checkOutDate
的正確方法。
我願意提出更改數據庫模型的建議,或者使用unixtime(如果它以任何方式有助於獲得正確的結果)。
以下搜索在搜索日期/時間和預訂日期/時間之間的重疊。 只要開始日期的時間是上午10點,結束日期的時間是下午2點(IOW,同一日期的時間不會重疊),它就可以工作。 它還需要保留日期為SQL類型TIMESTAMP。
SET @checkInDate = '2017-04-29 14:00:00';
SET @checkOutDate = '2017-05-01 14:00:00';
SELECT a.*,
IF(b.`stableid` IS NULL,"Avalalable","Not Available") as `status`,
@checkInDate as `avail_start_range`,
@checkOutDate as `avail_end_range`
FROM `stables` a
LEFT JOIN `event_detail_stable_registrations` b
ON a.`id` = b.`stableid` AND
(((`checkInDate` BETWEEN @checkInDate AND @checkOutDate)
OR (`checkOutDate` BETWEEN @checkInDate AND @checkOutDate))
OR ((@checkInDate BETWEEN `checkInDate` AND `checkOutDate`)
OR (@checkOutDate BETWEEN `checkInDate` AND `checkOutDate`))
)
WHERE b.`stableid` IS NULL
ORDER BY a.`name`;
應該返回868和869,並且不應該包括871作為日期為2017-05-01的登記入住
SET @checkInDate = '2017-04-29' , @checkOutDate = '2017-05-01' ;
select *
from event_detail_stable_registrations
where (checkInDate >= @checkInDate and checkInDate <= @checkOutDate)
and checkOutDate <= @checkOutDate;
或之間
SET @checkInDate = '2017-04-29' , @checkOutDate = '2017-05-01' ;
select *
from event_detail_stable_registrations
where (checkInDate between @checkInDate and @checkOutDate)
and checkOutDate <= @checkOutDate;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.