确保没有重叠

时间:2016-08-09 16:34:57

标签: mysql sql

我正在尝试为我正在处理的项目创建一个SQL语句。它应该返回所有d-feet的正确尺寸的车辆,并且尚未在租赁表中的那个日期安排。

架构(涉及2个表格)

vehicleId

声明的第一部分,在AND之前,返回所有车辆尺寸为van,第二部分在AND之后,应通过检查startdate或enddate是否重叠来删除在时间范围内计划的任何车辆。但是第二部分不是这样的,当运行时,整个事情都没有返回。

声明有什么问题。

2 个答案:

答案 0 :(得分:1)

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

 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'

答案 1 :(得分:1)

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

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”的租借。

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