1:对于预约一个时间段,查询数据库是否有数据,有就代表不可以预约
start为会议室要预约的开始时间,end为会议室要预约的结束时间
dataStart为数据库已经存在的预约开始时间,dataEnd为数据库已经存在的预约结束时间
2-1:可以分几种写法SQL语句
第一种:根据分段画圈来判断
WHERE
--满足第二和第四种情况
dataStart>=start AND dataEnd>=start
OR
--满足第一和第三种情况
dataStart>start AND dataStart<=end
第二种:根据分段画圈来判断
WHERE
--满足第三和第四种情况
dataEnd>=end AND dataStart<=end
OR
--满足第一和第二种情况
dataEnd<=end AND dataEnd>=start
第三种:(推荐)
WHERE
--满足一二三四种情况
dataEnd<=start AND dataStart>=end
3-1:如果是预约某天的情况,可进行优化
可以给此条件先进行按需要预约日期加索引筛查出查询的数据,如下
--先将start的开始时间截取年月日,设置为开始时间为00:00:00,结束为23:59:59
--例如,预约开始时间为2023-02-20 21:00:00
--查询那天有多少预约记录
WHERE start BETWEEN '2023-02-20 00:00:00' AND '2023-02-20 23:59:59'
AND
--满足第三和第四种情况
dataEnd>=end AND dataStart<=end
OR
--满足第一和第二种情况
dataEnd<=end AND dataEnd>=start
3-2:再进行查询优化,加上LIMIT 1
可以给此条件先进行按需要预约日期加索引筛查出查询的数据,如下
--先将start的开始时间截取年月日,设置为开始时间为00:00:00,结束为23:59:59
--例如,预约开始时间为2023-02-20 21:00:00
--查询那天有多少预约记录
WHERE start BETWEEN '2023-02-20 00:00:00' AND '2023-02-20 23:59:59'
AND
--满足第三和第四种情况
dataEnd>=end AND dataStart<=end
OR
--满足第一和第二种情况
dataEnd<=end AND dataEnd>=start
LIMIT 1
知识补充:
如果SQl语句中使用BETWEEN ** AND**查询,如果字段已经使用了索引,但是执行计划查询没有使用索引是因为,如果查询的数据为表总数据的60%就会进行全表查询,低于就会进行索引查询