先上sql:
select (to_date('2023-01-30','yyyy-MM-dd'), to_date('2023-02-01','yyyy-MM-dd')) overlaps (to_date('2023-01-01','yyyy-MM-dd'), to_date('2023-01-31','yyyy-MM-dd'));
返回值是布尔类型,如果两个时间有交集的话会返回true,如果两个时间没有交集的话返回false;
经测试overlaps两边的必须至少有一边是date类型,如果两边都是字符串类型则会报错;
两侧字符串类型:
--报错
select ('2023-01-01', '2023-01-31') overlaps ('2023-01-01', '2023-01-31');
左侧为date类型,右侧为字符串类型:
--正常,返回true,有交集
select (to_date('2023-01-01','yyyy-MM-dd'), to_date('2023-01-31','yyyy-MM-dd')) overlaps ('2023-01-30', '2023-02-01');
左侧为字符串类型,右侧为date类型:
--正常,返回false,无交集
select ('2023-01-01', '2023-01-31') overlaps (to_date('2023-02-01','yyyy-MM-dd'), to_date('2023-02-02','yyyy-MM-dd'));
左右两侧都为date类型:
--正常,返回true,有交集
select (to_date('2023-01-01','yyyy-MM-dd'), to_date('2023-01-31','yyyy-MM-dd')) overlaps (to_date('2023-01-01','yyyy-MM-dd'), to_date('2023-01-31','yyyy-MM-dd'));
实践举例:
现有一张订单表,表名为orders,表内数据如下图:
如果在开始时间和结束时间之间则表示该订单为有效订单,我要查询一个时间段内有效的订单就可以使用以下sql:
select *
from orders
where (start_time, end_time) overlaps ('2023-04-01', '2023-07-01');
返回结果如下:
可以看到我要查询四月到七月之间的有效订单,订单1和订单2均与该段时间有交集,而订单3因为与四月和七月没有交集所以为四月到七月之间的无效订单;