我正在尝试为我正在处理的项目创建一个SQL语句。它应该返回所有d-feet
的正确尺寸的车辆,并且尚未在租赁表中的那个日期安排。
架构(涉及2个表格)
vehicleId
声明的第一部分,在AND之前,返回所有车辆尺寸为van,第二部分在AND之后,应通过检查startdate或enddate是否重叠来删除在时间范围内计划的任何车辆。但是第二部分不是这样的,当运行时,整个事情都没有返回。
声明有什么问题。
答案 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”的租借。
重叠时间段的正确逻辑是一个句点在另一个句点开始之前开始,而第一个句点在另一个句点开始之后结束。