我被一个SQL查询卡住了。
我有这样一个情况:在bookings
表中。我有两个简单的DATETIME
列date_start
和date_end
,我有两个日期选择器,用户可以从中选择这两个日期和值,我们应该称之为dp_date_start
和dp_date_end
。
结果集中的行需要符合以下条件:
- 如果
date_start
和date_end
完全在这个范围内 - 如果只有
date_start
或date_end
在该范围内 - 如果
date_start
或date_end
是边框值
基本上这是一个预订逻辑,想象一下,如果一个房间已经有人了,就不能预订了。
我已经试过了:
SELECT *
FROM bookings
WHERE 'dp_date_start' BETWEEN start_date AND end_date
OR 'dp_date_end' BETWEEN start_date AND end_date
OR start_date BETWEEN 'dp_date_start' AND 'dp_date_end'
OR end_date BETWEEN 'dp_date_start' AND 'dp_date_end';
但如果失败,即'dp_date_start'
等于end_date
。
提前感谢!
您有两个开始日期和两个结束日期。您可以检查两个开始日期是否在两个时间段之间,如下所示:
SELECT * FROM bookings
WHERE dp_date_start between start_date AND end_date
OR start_date BETWEEN dp_date_start and dp_date_end
这里有一个很好的解释来解决您的问题。https://stackoverflow.com/a/325964/1500601。很好地解释了找到这种重叠的逻辑。
您可以根据此逻辑修改查询。实现可能是这样的:
SELECT * FROM bookings WHERE dp_date_start <= end_date AND start_date >= dp_date_end