oracle数据库中,查询时间在两个日期之间(只要重叠就算)的所有的数据。

背景介绍

今天项目中要做一个参观实验室的预约系统,其中对于用户选择的参观时间段(如2019-10-09 10:30:00至2019-10-09 11:30:00)上进行判断,如果其他的参观人员在该时间段已经预约过两次,则提示用户不能再进行预约。

解决方案

了解需求后,对于这个问题马上网上百度(大多数人一样的思路),找了很多资料,感觉不是很好,其中有一篇文章的思路还可以,https://blog.****.net/qq_16583687/article/details/75669865,https://blog.****.net/u012527802/article/details/73551236大家可以看一下。
我是按照自己的思路写的,结果也是正确的。
根据输入的两个时间参数(startTime,endTime),查询数据库表中T-startTime字段在startTime,endTime的数据(左闭右开) OR T-endTime字段在startTime,endTime的数据(左开右闭),
这时候查询的数据是不完整的,还差一种情况(startTime,endTime时间段包含T-startTime,T-endTime时间段),此时再 OR 上(T-startTime < startTime and T-endTime > endTime),这时就把所有的情况都包含进去了。根据查询的结果数如果大于2则说明不能再进行预约。
手残党将就着看吧,后面会有查询语句的。

sql查询语句

select * from HW_ORDER_T
where
(
(START_TIME >= to_date(‘2019-10-10 10:00:00’,‘yyyy-mm-dd hh24:mi:ss’) AND START_TIME < to_date(‘2019-10-10 10:30:00’,‘yyyy-mm-dd hh24:mi:ss’))
OR
(END_TIME > to_date(‘2019-10-10 10:00:00’,‘yyyy-mm-dd hh24:mi:ss’) AND END_TIME <= to_date(‘2019-10-10 10:30:00’,‘yyyy-mm-dd hh24:mi:ss’))
)
OR
(
START_TIME < to_date(‘2019-10-10 10:00:00’,‘yyyy-mm-dd hh24:mi:ss’) AND END_TIME > to_date(‘2019-10-10 10:30:00’,‘yyyy-mm-dd hh24:mi:ss’)
)
下图一是表中的原数据,图二是查询后的数据,只要是包含在该时间段内的数据都会查出。(10号的预约数据不多,之前拿九号的数据进行过测试,OK)
oracle数据库中,查询时间在两个日期之间(只要重叠就算)的所有的数据。
oracle数据库中,查询时间在两个日期之间(只要重叠就算)的所有的数据。