【问题标题】:MySQL querying date rangeMySQL查询日期范围
【发布时间】:2014-01-07 21:23:22
【问题描述】:

这是我的数据库(酒店的免费房间,简化版)

rooms_available

id  date_available   room_id
================================
1   2013-12-19       2
2   2013-12-20       2
3   2013-12-21       2
4   2013-12-22       2
5   2013-12-23       2
6   2013-12-25       3

房间

id  name           minimal_range
================================
2   Apartment A    5
3   Apartment B    1

我想查询 2013-12-20 和 2013-12-22 之间所有可用的房间

我的查询是这样的:

select * 
from rooms_available 
where (date='2013-12-20' OR date='2013-12-21' OR date='2013-12-22')

我的问题:

  • 有没有更舒服的方法?当日期范围为 2 周时,查询也会很长(查询时间会更长)
  • 是否可以考虑最小范围 - 例如:room_id 2 仅适用于至少 5 晚(参见表“房间”) -> 因此上述查询不应返回任何记录

谢谢

【问题讨论】:

  • 我怀疑在房间被占用而不是在可用时存储更常见
  • 这个问题在 SO 上被问了大约 100 次,所以你下次可能要检查已经回答的问题

标签: php mysql


【解决方案1】:

日期 >= '2013-12-20' 和日期

【讨论】:

    【解决方案2】:
    SELECT * FROM rooms_available WHERE `date_available` BETWEEN "2013-12-20 " AND "2012-03-31"
    

    【讨论】:

      【解决方案3】:

      我没有对此进行测试,但它应该为您指明正确的方向,尤其是对于您关于最小范围的问题的第二部分。

      SELECT t1.id as id, t1.date_available as date_available, t1.room_id 
      FROM rooms_availble as t1 JOIN rooms as t2 on t1.room_id = t2.id 
      WHERE t1.date_available BETWEEN DATE('2013-12-20') AND DATE('2012-03-31') AND
      t2.minimal_range <= datediff('2013-12-22', '2012-12-20');
      

      mysql datediff 函数将返回两个日期之间的天数,然后您可以将其与房间连接表中的 minimum_range 进行比较。您也可以考虑将开始日期和结束日期绑定到变量,这样您只需将每个日期写入一次。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-01
        • 2020-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-24
        相关资源
        最近更新 更多