如何编写SQL基于指定日期范围筛选存在旅行重叠的旅行者
修正SQL语句以返回与查询日期范围重叠的旅行者
原SQL语句的WHERE条件仅筛选旅行时段完全处于查询日期范围内的记录,无法满足“旅行时段与查询范围存在任意重叠即返回”的需求。
正确的时间段重叠判断逻辑
两个时间段(旅行时段[DepartureDate, ReturnDate]和查询时段[@DateFrom, @DateTo])存在重叠的核心判断条件是:
DepartureDate <= @DateTo AND ReturnDate >= @DateFrom
这个条件可以覆盖所有重叠场景:
- 旅行时段完全包含在查询范围内
- 查询范围完全包含在旅行时段内
- 旅行出发于查询范围内、返回于查询范围外
- 旅行返回于查询范围内、出发于查询范围外
修正后的完整SQL代码
DECLARE @DateFrom DATE = '2022-01-05', @DateTo DATE = '2022-01-15' DROP TABLE IF EXISTS #Dates CREATE TABLE #Dates ( DepartureDate Date NULL, ReturnDate Date NULL, Name VARCHAR(8) NULL ) INSERT INTO #Dates (DepartureDate, ReturnDate, Name) VALUES ('2022-01-01', '2022-01-10', 'Mike' ) SELECT * FROM #Dates WHERE DepartureDate <= @DateTo -- 旅行开始不晚于查询结束 AND ReturnDate >= @DateFrom -- 旅行结束不早于查询开始
验证示例
- 当
@DateFrom='2022-01-05'、@DateTo='2022-01-15'时,Mike的旅行时段与查询范围重叠,会被正确返回; - 当
@DateFrom='2021-12-01'、@DateTo='2021-12-05'时,两者无重叠,不会返回Mike的记录,符合需求。
内容的提问来源于stack exchange,提问作者Etienne
相关产品推荐
相关产品推荐

