mysql - 获取给定时期 MySQL 查询的可用马厩

标签 mysql sql

这是SQL fiddle

正确答案应该是864871

这些应该是正确的答案,因为如果有人在某个日期退房,则与酒店相同,这意味着当天有房间可用。

下面是数据库字段

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

stables
| id | name |

其中checkinDate采用YYYY-MM-DD格式。

预期输出为

Available Stables
864
871

我这么说是因为它的工作方式与酒店预订相同,其中 checkInDate 表示客户将在当天抵达,并且可以在中午 12:00 之后入住,但 checkOutDate表示客户当天上午 11:00 或之前离开。

因此,如果 checkOutDate2017-05-01,则意味着稳定版本将于 2017-05-01 12 起提供:下午 00 点。

如果我错误地保存数据,请告诉我存储 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`;

关于mysql - 获取给定时期 MySQL 查询的可用马厩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43360037/

相关文章:

php - 选择查询花费的时间太长

MYSQL 计数行直到最后一个不同的行

sql - 查询失败错误: Views cannot be queried through prefix.匹配 View 的部分列表是

java - 如何使jOOQ引用保留关键字的表名?

mysql - LOAD DATA INFILE 在我的服务器上不起作用

mysql - 部分提交 MySQL 事务?

java - 该程序不会打印数据库中的所有值

mysql - 有没有办法使用 MYSQL 中的 max() 函数创建多列?

mysql - 按纬度/经度选择位置几乎相同(重复)的地方

sql - 将表情符号/表情符号添加到 SQL Server 表