正确答案应该是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:00 或之前离开。
因此,如果 checkOutDate
为 2017-05-01
,则意味着稳定版本将于 2017-05-01
12 起提供:下午 00 点。
如果我错误地保存数据,请告诉我存储 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`;
关于mysql - 获取给定时期 MySQL 查询的可用马厩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43360037/