最近写一个项目,数据表插入数据的时候有一个特殊要求:
表结构属性如下:id startime endtime value;
插入数据的要求就是插入的时间段starttime-endtime不能在已有记录的starttime-endtime之间。
举个例子:加入已有的记录如下
1 3:00 5:00 10;2 6:00 8:00 20;3 10:00 14:00 15;4 16:00 10:00 20
那么插入的数据不能是4:00-5:00,因为4:00已经在3:00-5:00时间段中,也不能是2:00-9:00,因为包含了3:00-5:00和6:00-8:00的时间段。
开始觉得有点麻烦,不过仔细想想还是很好操作。
首先排除记录中所有endtime小于插入的st(新插入的starttime)的数据。用剩下的数据集来比较。
然后起始时间(st)大于starttime小于endtime的不得插入;
结束时间et(新插入的endtime)大于starttime小于endtime的不得插入;
起始时间(st)小于starttime,并且结束时间(et)大于endtime的不得插入;
最后在mybatis下的查询不可插入的记录的sql语句如下
<select id="getTimeToCompare" resultType="Time" parameterMap="paraMap"> <![CDATA[ select * from Time where id = #{id} and endtime > #{starttime} and ((starttime <= #{starttime} and endtime >= #{starttime}) or (starttime <= #{endtime} and endtime >= #{endtime}) or (starttime >= #{starttime} and endtime <= #{endtime})) ]]> </select>