簡體   English   中英

獲取給定時期MySQL查詢的可用穩定器

[英]Get available stables for given period MySQL query

這是SQL小提琴

正確答案應該是864871

這些應該是正確的答案,因為如果有人在某個日期退房(這意味着該房間在同一天有空),則該答案與酒店相同。

以下是數據庫字段

stable_registrations
| id | user | stableId | checkInDate | checkOutDate | 

stables
| id | name |

其中checkinDateYYYY-MM-DD格式。

預期輸出為

Available Stables
864
871

我之所以這樣說是因為它與“酒店預訂”的工作原理相同,其中checkInDate表示客戶將在當天抵達,並且可以在12:00 PM后簽入,而checkOutDate意味着客戶在當天11:00 AM或之前離開。

因此,如果checkOutDate2017-05-01 ,則表示穩定時間為2017-05-01 12:00 PM。

如果我不正確地保存數據,那么請告訴我存儲checkInDatecheckOutDate的正確方法。

我願意提出更改數據庫模型的建議,或者使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM