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

2023-12-22 14:29:20

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

那么一开始会想着把所有的情况的条件都写到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 &gt; #{endTime} or end_time &lt; #{startTime})

文章来源:https://blog.csdn.net/jl15988/article/details/135151551
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。