【问题标题】:Select bookings between 2 dates, even though they did not end yet选择两个日期之间的预订,即使它们尚未结束
【发布时间】:2020-06-08 17:28:23
【问题描述】:

我正在尝试显示两个日期之间的预订/预订详细信息。

我有这个日历:

如果我选择,我想查看在日期 2020 年 6 月 9 日和 2020 年 6 月 11 日之间“发生”的预订的详细信息,我想同时获得这两个预订(蓝色和红色)。我的意思是,无论何时进行预订或何时结束预订都无关紧要,如果它在这两个日期之间处于活动状态,则应该显示它。

所以我需要实现的目标: 如果我选择我想显示日期 2020-06-09 和 2020-06-11 之间的预订,我应该返回红色(2020-06-10 --- 2020-06-12)和蓝色(2020-06- 08 --- 2020-06-12) 预订。

现在我有这个 MySQL 查询,但它似乎不能正常工作。

SELECT * FROM Bookings WHERE CONVERT('2020-06-09', DATE) BETWEEN booked_from

AND booked_until AND CONVERT('2020-06-11', DATE) BETWEEN  booked_from AND booked_until

【问题讨论】:

标签: php mysql sql database


【解决方案1】:

如果我对问题的理解正确,您正在寻找结束日期在 2020 年 6 月 9 日之后且开始日期在 2020 年 6 月 11 日之前的任何数据库记录。这将选择与您的日期范围重叠的任何预订,无论是在该范围之前开始和在该范围内结束、在该范围内开始和在该范围之后结束、在该范围之前和之后开始还是在该范围内开始和结束。在所有这些情况下,它在您较晚的日期之前开始并在您的较早日期之后结束。所以试试这个:

SELECT * FROM Bookings WHERE STR_TO_DATE('2020-06-09', '%Y-%m-%d') <= booked_until AND STR_TO_DATE('2020-06-11', '%Y-%m-%d') >= booked_from

注意:我已将 CONVERT 函数替换为更明确的 STR_TO_DATE 函数,但您的最终查询可能会略有不同,具体取决于您使用它的数据库以及您使用的架构。

【讨论】:

    【解决方案2】:

    如果您使用如下查询,它可能对您有用:

    SELECT * FROM Bookings 
    WHERE (DATE(booked_from) 
      BETWEEN DATE('2020-06-09) 
      AND DATE('2020-06-11)) 
    AND (DATE(booked_until) 
      BETWEEN DATE('2020-06-09) 
      AND DATE('2020-06-11))
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
    • 请编辑您的答案以解释它是如何回答问题的。How do I write a good answer?
    猜你喜欢
    • 2020-03-13
    • 1970-01-01
    • 2011-09-10
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多