Mysql 确保没有重叠

Mysql 确保没有重叠,mysql,sql,Mysql,Sql,我正在尝试为我正在进行的项目创建一个SQL语句。它应该返回所有大小合适的车辆ID,并且在租赁表中尚未在该日期安排 涉及的2个表的架构 语句的第一部分,在AND之前,返回所有尺寸为van的vehicleid,第二部分,在AND之后,应通过检查开始日期或结束日期是否重叠,删除时间范围内计划的任何vehicleid。但第二部分不是这样工作的,当运行时,整个过程不会返回任何结果 这句话有什么不对 你没有引用日期,所以它们不是日期-它们是数学表达式: rental.enddate BETWEEN 201

我正在尝试为我正在进行的项目创建一个SQL语句。它应该返回所有大小合适的车辆ID,并且在租赁表中尚未在该日期安排

涉及的2个表的架构

语句的第一部分,在AND之前,返回所有尺寸为van的vehicleid,第二部分,在AND之后,应通过检查开始日期或结束日期是否重叠,删除时间范围内计划的任何vehicleid。但第二部分不是这样工作的,当运行时,整个过程不会返回任何结果


这句话有什么不对

你没有引用日期,所以它们不是日期-它们是数学表达式:

 rental.enddate BETWEEN 2016-04-27 AND 2016-04-30
执行时就好像它是2016减去4减去27:

 rental.enddate BETWEEN 1985 AND 1982
它们都应该被引用:

 rental.enddate BETWEEN '2016-04-27' AND '2016-04-30'

您没有引用日期,因此它们不是日期-它们是数学表达式:

 rental.enddate BETWEEN 2016-04-27 AND 2016-04-30
执行时就好像它是2016减去4减去27:

 rental.enddate BETWEEN 1985 AND 1982
它们都应该被引用:

 rental.enddate BETWEEN '2016-04-27' AND '2016-04-30'

您的问题可能是原始查询中的引号以及在中使用而不是。但更重要的是,重叠的逻辑是错误的。我想你想要:

SELECT v.vehicleId 
FROM vehicles v
WHERE v.size = 'van' AND
      v.vehicleId NOT IN (SELECT r.vehicleId 
                          FROM rental r 
                          WHERE r.startdate <= '2016-04-30' AND
                                r.enddate >= '2016-04-27'
                         );
作为一个简单的例子,从“2016-04-01”到“2016-05-01”的租金不会按照您的逻辑正确标记


重叠时间段的正确逻辑是,一个时间段在另一个时间段结束之前开始,第一个时间段在另一个时间段开始之后结束。

您的问题可能是原始查询中的引号以及在中使用而不是不使用。但更重要的是,重叠的逻辑是错误的。我想你想要:

SELECT v.vehicleId 
FROM vehicles v
WHERE v.size = 'van' AND
      v.vehicleId NOT IN (SELECT r.vehicleId 
                          FROM rental r 
                          WHERE r.startdate <= '2016-04-30' AND
                                r.enddate >= '2016-04-27'
                         );
作为一个简单的例子,从“2016-04-01”到“2016-05-01”的租金不会按照您的逻辑正确标记


重叠时间段的正确逻辑是,一个时间段在另一个时间段结束之前开始,第一个时间段在另一个时间段开始之后结束。

在中添加了引号,但语句仍然不返回任何内容。如果子查询可以返回多行数据,请在上面进行编辑以反映您可能还希望不在而不是中的更改。我需要的是不在。谢谢,我在这件事上坚持的时间比我愿意承认的要长。你应该得到关于这件事的警告/错误。最好检查您的错误处理。在中添加了引号,但语句仍然不返回任何内容。如果子查询可以返回多行数据,请在上面进行编辑以反映您可能还希望不在而不是中的更改。我需要的是不在。谢谢,我在这件事上坚持的时间比我愿意承认的要长。你应该得到关于这件事的警告/错误。最好检查您的错误处理。