当前位置: 首页 > 面试题库 >

酒店预订系统SQL查询:确定何时可以使用一个特定的房间

田文景
2023-03-14
问题内容

我有一个酒店预订系统的查询,当有特定房间时,我需要查找日期。(这是一家精品酒店,人们在其中预订特定的房间,因此在获得此代码之前,他们知道他们想要的确切房间。
我要查找的结果是一个房间的详细信息,我在查询中指定了一个房间-我是不查找多个房间的信息。

“可用性”表模式很简单,每一行是:

room_id
date_occupied - a single day that is occupied (like '2011-01-01')

因此,例如,如果某个房间在1月1日至1月5日期间被占用,则将五行添加到可用性表中,每一天占据该房间。

这是我要解决的问题:

  • 查询以查找在开始日期和结束日期之间何时有特定房间可用的查询,例如:
SELECT rooms.* FROM rooms, availability
 WHERE rooms.id = 123
   AND availability.room_id = rooms.id
   AND nothing between start_date and end_date is in

availability.date_occupied

  • 我也在寻找一个类似的查询,我只想查看在开始日期和接下来的两天是否有可用的特定房间,例如:
SELECT rooms.* FROM rooms, availability
 WHERE rooms.id = 123
   AND availability.room_id = rooms.id
   AND start_date, start_date+1day and start_date+2days is not in

availability.date_occupied

我有点想找出确切的联接。有什么建议?请注意,如果有帮助,我完全可以使用可用性表的其他模式。无论哪种方式,查询都能最有效地工作。


问题答案:

我认为,执行此操作的最佳方法是简单地运行查询以查看是否有房间被占用,并在不返回任何行的情况下指示可用性。

因此,对于您的第一个查询:

SELECT COUNT(id) AS occupied_days FROM availability
WHERE room_id = 123
      AND date_occupied BETWEEN @start_date AND @end_date;

如果occupied_days == 0可以的话。

对于第二个查询,只需替换@end_dateDATE_ADD(@start_date, @num_days)

对于涉及联接的答案仅作一些评论:由于将搜索限制在特定范围内room_id,因此将availability表联接到room表是没有意义的,因为它没有提供必要的信息。所有这些LEFT JOIN都使查询变得复杂, 可能会降低 性能,并且没有任何用处。

另外,虽然您可能不愿先搜索占用率然后推断出可用性,但我猜想此查询是迄今为止查询引擎优化最快和最容易的方法,因为它基于单个列(如果建立索引),会使事情变得更快。



 类似资料:
  • 我在Delphi2010(TADOQuery)中使用ADO数据库。 目的是找到可用的房间,并显示一家小旅馆的房间价格。 房间(_R) t_typeroom t_trans 目前,我使用下面的查询来显示房间价格。 并设法显示:(在Delphi2010的ADOQuery1和DBGrid1中) 我想做的是如何显示t_trans内尚未预订或未签入的代码室?(具体日期) 也许像这样(使用运算符): 问题是如

  • 我看过很多类似的问题,但还没能让它为我所用。我正在创建一个酒店预订系统,我希望列出在请求的预订日期至少有一个房间可用的酒店。 这是我到目前为止提出的问题 我是MySQL的新手,这真的失控了。这个想法是计算酒店的房间总数,减去给定日期范围内预订的房间总数。我能得到一些帮助吗? 子查询 它自己就能很好地工作,但这个不行。

  • 问题内容: 嗨,在阅读了StackOverflow上的其他问题后,我一直在尝试建立自己的系统来检查房间价格。 当预订日期中的房价没有重叠时,我的查询工作正常并产生正确的天数,但是当重叠时,我在第二行结果中得到了额外的一天。 例如,某人到达2011-04-14并离开2011-04-16(2天)。15日的费率从66更改为70,因此他应该以66的费率有1天,以70的费率有1天。 我尝试过没有TIMEDA

  • 问题内容: 我在编写sql以从表中获取可用房间时遇到问题。我的表结构如下。 表:预订 桌子:房间 包含有关房间的详细信息,该表的主键是room_id,它具有1至10个房间,共10个房间。 我的问题是我想知道这些房间在2012年9月14日6:00 pm至21-09-2012 9:00 am之间可用,这意味着我应该只将room_id的结果作为1,3,5,7,8 ,9,10。 有人可以帮我编写SQL来从

  • 问题内容: 我的项目中有一种情况,如下所示。 在检查可用房间时 第一个查询从满足日期范围的预订表中检索房间号列表 类似地,第二个从餐桌预订上做同样的事情 最后一个查询使用上面两个查询提供的列表,并获取不在生成的列表中的房间列表。 可以在2010年10月8日/ 2010年8月15日正常工作 在20-08-2010 / 25-08-2010可以正常工作 当我给出10到15之间的日期时,它对于20到25

  • 问题内容: 我有这张表来查询不同季节(高,低)季节的房间价格 如何获得不同天数和不同季节的5天总价.. 看这张表 这是我的命令(mysql)我想从 2013年4月7日* 到 2013年 11月7日获得10晚的总价格 * 添加 我写了这个命令,但是还是没用 错误:#1305-功能saudihot_saudihotels.strtodate不存在 问题答案: 这是查询: 注意,表达式要简单得多,现在星