获取给定时期MySQL查询的可用稳定值

时间:2017-04-12 03:59:11

标签: mysql sql mysqli

以下是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表示客户正在离开当天上午1​​1点或之前的那一天。

因此,如果checkOutDate2017-05-01,则意味着2017-05-01中午12:00可以使用稳定版。

如果我保存的数据不正确,请告诉我存储checkInDatecheckOutDate的正确方法。

我愿意改变数据库模型,或者使用unixtime,如果它能以任何方式帮助获得正确的结果。

2 个答案:

答案 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;