以下是SQL fiddle
正确答案应为864
和871
。
这些应该是正确的答案,因为如果有人在某个日期退房,这意味着该房间在同一天可用,那么它就像酒店一样。
以下是数据库字段
stable_registrations
| id | user | stableId | checkInDate | checkOutDate |
stables
| id | name |
checkinDate
格式为YYYY-MM-DD
。
预期输出
Available Stables
864
871
我之所以这样说,是因为它与酒店预订相同,checkInDate
表示客户将在当天抵达并可在中午12:00之后办理入住,但checkOutDate
表示客户正在离开当天上午11点或之前的那一天。
因此,如果checkOutDate
为2017-05-01
,则意味着2017-05-01
中午12:00可以使用稳定版。
如果我保存的数据不正确,请告诉我存储checkInDate
和checkOutDate
的正确方法。
我愿意改变数据库模型,或者使用unixtime,如果它能以任何方式帮助获得正确的结果。
答案 0 :(得分:1)
以下搜索搜索日期/时间与预订日期/时间之间的重叠。只要开始日期的时间是上午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`;
答案 1 :(得分:1)
应返回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;