hotel date filter:仅返回为range指定的最短入住期限的酒店(sql或elasticsearch)

x4shl7ld  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(276)

假设你有一个酒店数据库。每家酒店在数据库中创建多个价格,每个价格都有一个 from_date 以及 to_date . 利率保证永不重叠。
在每种价格中,酒店经理可以设定该期间的最低入住率。例如,从12月1日到1月30日,最少入住10晚。
现在一个旅行者输入他的日期,例如12月25日到1月1日。在这种情况下,结果中不应返回此酒店,因为12月1日到1月30日的费率规定只欢迎入住至少10晚。
我想不出一种方法来查询这个数据库(使用sql或elasticsearch,这是我们目前的搜索引擎),以避免返回在该日期范围内最低入住率较高的酒店。
在sql中,我将探索一条路径 joining hotels表和rates表,使用 WHERE 获得与旅行者期望的日期重叠的费率(可能使用algo (StartA <= EndB) and (EndA >= StartB) ),加上一个聚合函数,如 MAX() 达到最大值 min_stay 最后是 HAVING 若要指定它,则应大于旅行者提供的范围内存在的夜数。
但即使是这条路对我来说也是晦涩难懂的,因为当我加入一个表时,我会排除没有配置任何费率的酒店,这不是我想要的;也许是左外连接?如何将其转换为elasticsearch应该是一个更大的挑战(可能使用类似于本文所描述的bucket聚合的东西)https://stackoverflow.com/a/46953947/1290457)

cu6pst1q

cu6pst1q1#

下面是查询的大致轮廓。它假设利率的结束日期是包含在内的。

SET @checkin  = '2018-12-25';
SET @checkout = '2019-01-01';
SET @date1    = @checkin;
SET @date2    = @checkout - INTERVAL 1 DAY;
SET @nights   = DATEDIFF(@checkout, @checkin);

SELECT *
FROM hotels
WHERE NOT EXISTS (
    SELECT 1
    FROM hotel_rates
    WHERE hotel_id = hotels.id
    AND @date2 >= from_date AND to_date >= @date1
    AND min_stay > @nights
)

它检查每个酒店,不存在与给定日期范围相交且要求最小入住时间大于夜数的价格。

相关问题