sql之按时间段查询时间段(时间段取交集)

在一些需求中,可能会出现按时间段查询时间段的逻辑,也就是说前端传的有一个开始时间和一个结束时间参数,数据库中也有一个开始时间和一个结束时间字段,我们需要取这两者的交集。

那么一开始会想着把所有的情况的条件都写到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})

你可能感兴趣的:(数据库,sql,数据库)