我在几个地方寻找过这个,但不一定找到正确的答案。
我正在尝试查询给定时间范围内的可用提供程序。我有一列包含所有带有 date_start 和 date_end 的旧预订。基本上,如果我想进行预订,我需要确保我的供应商可用。到目前为止,查询的工作原理如下:
SELECT a.provider a
FROM l_provider_zip a
(several inner Joins and conditions)
WHERE a.zip = :zip
AND a.provider_id
NOT IN (
SELECT da.provider_id
FROM booking da
WHERE da.provider_id IS NOT NULL
AND (
( :start BETWEEN da.date_start AND da.date_end)
OR ( :end BETWEEN da.date_start AND da.date_end)
OR ( da.date_start BETWEEN :start AND :end )
)
)
我担心的是,为了查找是否有可用于新预订的提供商,我需要确保新预订不会与其他预订发生冲突。在这里,我有 3 个条件语句来弄清楚。
- :start(of the new booking) BETWEEN da.date_start AND da.date_end
- :end(of the new booking) BETWEEN da.date_start AND da.date_end
- da.date_start BETWEEN :start AND :end (另一个预订不在新预订的开头或结尾)
这似乎效率很低,但我找不到更好的方法。当然我可以通过索引来提高效率,但是有没有更好的方法来执行这个操作。这是我项目的一个核心问题,我认为这可能是许多人已经面临并将继续面临的问题。再次感谢!