Mysql 在不包含两个日期的条件之间使用

Mysql 在不包含两个日期的条件之间使用,mysql,sql,Mysql,Sql,是否有一种简单的方法可以使用BETWEEN,但不包括您要检查的两个日期?我注意到,如果您使用BETWEEN,它包括开始日期和结束日期本身。我一直在开发一个预订系统,我想阻止客人在另一个预订或重叠另一个预订之间预订日期 例如,如果有5月20日至5月25日的预订,我不希望任何人能够预订这些日期,无论新预订的开始日期和结束日期如何。但是,我确实希望用户能够将其结束日期与其他预订的开始日期在同一天,或者将开始日期与其他预订的结束日期在同一天 最初我有: SELECT id FROM table

是否有一种简单的方法可以使用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月6日和15日


我认为我所做的是正确的,我仍在努力解决这一切,但如果有人能看到我错在哪里,那将是有益的

如果表中有一行的到达日期小于查询的出发日期,而出发日期大于查询的到达日期,则您将得到结果“预订”,否则您将得到“免费”:

将:到达日期和:离开日期替换为您将作为参数传递的日期


参见。

但是为什么要把自己绑在两者之间呢?完全忘记了@TheWelshManc,因为你描述的情况是:离开日期,所以我提前测试了11月9日到11月11日的预订。我试着从11月7日订到11月9日,但没有成功。然后,我测试了两个随机日期,没有任何重叠,结果不起作用。基本上,如果它在表中找到任何日期,它会说已经有预订,并返回一个错误页。@11月9日的威尔士人不是一个日期,也不具有可比性。列的数据类型是什么?列是日期。我有预订开始日期和预订结束日期。它们的格式为YYYY-MM-DD,因此11月9日为2021-11-09。
SELECT CASE
  WHEN EXISTS (
    SELECT 1 
    FROM `table` 
    WHERE :depart_date > arrive_date AND :arrive_date < depart_date
  ) THEN 'booked'
  ELSE 'free'
END result