在一些需求中,可能会出现按时间段查询时间段的逻辑,也就是说前端传的有一个开始时间和一个结束时间参数,数据库中也有一个开始时间和一个结束时间字段,我们需要取这两者的交集。
那么一开始会想着把所有的情况的条件都写到sql中,如下。
由此得出如下公式:
S1 < S2 and E1 < E2
or
S1 > S2 and E1 > E2
or
S1 < S2 and E1 > E2
or
S1 > S2 and E1 < E2
但你会发现,这样的查询很费劲,而且很难理解。于是乎,我们反向思考,既然查交集费劲,那我们可以查不交集的,然后通过not取反条件不就好了。
公式:
E1 < S2 or S1 > E2
取反:
not (E1 < S2 or S1 > E2)
下面是sql参考
select book_id, book_name
from book
where not (start_time > '2023-12-20 10:30:00' or end_time < '2023-12-20 08:00:00')
xml是这样的
select book_id, book_name
from book
where not (start_time > #{endTime} or end_time < #{startTime})