我有一项业务是在旅行时出租国际电话号码给客户。当客户下订单时,我希望根据客户的start_date和end_date向客户显示预订日期的可用电话号码。
因为这些电话号码是租出去的,所以我只需要从表中选择那些还没有租出去的号码,因为它们的日期会影响当前客户的日期。
我也不想在结束日期后7天内出租任何电话号码。也就是说,如果一个客户预订了2020年1月1日到2020年1日之间的电话号码,我不希望这个电话号码在2020年1月27日之前被另一个客户预订。我希望电话号码有一个7天的窗口是明确的。
我有一个包含电话号码的表和一个包含通过phone_number_id与电话号码表相关的订单的表。orders表中有用于旅行的当前客户start_date和end_date,但还没有保存电话号码id。orders表还包含所有其他客户的旅行日期的start_date和end_date,以及为他们的旅行日期分配/预订了哪些phone_number_id。
当尝试选择可用于当前客户日期的电话号码时,SQL查询会是什么样子?
发布于 2019-12-04 08:12:42
您正在寻找没有订单与目标租期重叠的电话号码。假设目标租期由参数:start_date和:end_date定义,您可以这样做:
select p.*
from phone_numbers p
left join orders o
on o.phone_number_id = p.phone_number_id
and :start_date + interval 7 day <= o.end_date
and :end_date >= o.start_date + interval 7 day
where o.phone_number_id is null即:对于每个电话号码,尝试查找周期与目标租赁周期重叠的订单(额外清空7天),并过滤不存在重叠订单的订单。
注意:将日期添加到日期的实际语法可能因您的RDBMS而异。
发布于 2019-12-04 08:16:16
我不确定您使用的是什么数据库,但这里有一个基于Oracle语法的示例。他们的关键是将七天加到结束日期上,以获得七天保证金。
SELECT *
FROM my_table
WHERE TO_DATE('01/01/2020','MM/DD/YYYY') NOT BETWEEN start_date
AND end_date + 7
AND TO_DATE('01/20/2020','MM/DD/YYYY') NOT BETWEEN start_date
AND end_date + 7https://stackoverflow.com/questions/59167176
复制相似问题