【问题标题】:Using BETWEEN Condition Without Including Two Dates在不包含两个日期的情况下使用 BETWEEN 条件
【发布时间】:2021-05-15 14:06:57
【问题描述】:

有没有使用 BETWEEN 但不包括您要检查的两个日期的简单方法?我注意到如果你使用 BETWEEN 它包括开始和结束日期本身。我一直在研究预订系统,并希望在另一次预订之间或与另一次预订重叠时阻止客人预订日期。

例如如果有 5 月 20 日至 5 月 25 日的预订,我不希望任何人能够预订这些日期,无论新预订的开始和结束日期如何。不过,我确实希望用户能够将其结束日期设置为与其他预订的开始日期相同的日期,或者将开始日期设置为与不同预订的结束日期相同的日期。

原来我有:

SELECT id 
  FROM table 
 WHERE (? BETWEEN arrive_date AND depart_date) 
    OR (? BETWEEN arrive_date AND depart_date)

第一个?是为了新的到达日期和第二个?是新的结束日期。

但是当检查它包括开始和结束日期时,我试图制定正确的公式并得到这个:

SELECT id FROM table 
 WHERE (? BETWEEN arrive_date - INTERVAL 1 DAY AND depart_date - INTERVAL 1 DAY) 
    OR (? BETWEEN arrive_date + INTERVAL 1 DAY AND depart_date - INTERVAL 1 DAY)

看起来不错,但后来我注意到如果我预订,例如 11 月 9 日和 11 月 10 日,我也可以预订 11 月 15 日的 6 日。

我认为我所拥有的是正确的,我仍在努力解决问题,但如果有人能看到我哪里出错了,那将会很有帮助!

【问题讨论】:

  • 但是为什么要把自己束缚在 BETWEEN 上呢?

标签: mysql sql


【解决方案1】:

如果表格中有一行arrive_date小于查询的出发日期,depart_date大于查询的到达日期,则结果为'booked',否则为'free'

SELECT CASE
  WHEN EXISTS (
    SELECT 1 
    FROM `table` 
    WHERE :depart_date > arrive_date AND :arrive_date < depart_date
  ) THEN 'booked'
  ELSE 'free'
END result

:arrive_date:depart_date 替换为您将作为参数传递的日期。

请参阅demo

【讨论】:

  • 完全忘记了
  • @TheWelshManc 对于您描述条件:depart_date &lt;= arrive_dateTRUE 的情况,使得WHERE 子句中的条件也是TRUE。那么它是如何不起作用的呢?发布示例数据以阐明您想要什么。
  • 所以我提前进行了测试,将 11 月 9 日预订到 11 月 11 日预订。我试图在 11 月 7 日至 11 月 9 日预订,但没有成功。然后我测试了两个没有任何重叠的随机日期,但它没有用。基本上,如果它在表格中找到任何日期,它会说已经有预订并返回错误页面。
  • @TheWelshManc 9th November 不是日期,也没有可比性。列的数据类型是什么?
  • 列是日期。我有一个预订开始日期和一个预订结束日期。它们的格式为 YYYY-MM-DD,因此 11 月 9 日是 2021-11-09。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
相关资源
最近更新 更多