一道很贱的面试题
数据库有某表有三个主键ID,日期From,日期To,其中某ID下日期From一定小于等于日期To。如何判断新插入的字段日期区间互相不重叠,新插入的字段日期From也一定小于等于日期To。
也就是说这样的数据是可以的
而这样的数据都是不行的
我一开始的思路是这样的
就是要开始时间大于结束时间或者结束时间小与开始时间
于是写出了这样的SQL
SELECT COUNT(1) FROM XXXXXXX WHERE No = @No AND SubNo = @SubNo AND NOT (@EndDate < StartDate OR @StartDate > EndDate)
可是这是不对的反例如下:
假设你只有一条记录,10-20 ,要插入 9-25,根据你现在的9>20||25<20
我只好找出所有应该报错的情况,分三种,以下应该是正确的,如果是错误的我会更新
SELECT COUNT(1) FROM XXXXXXX WHERE No = @No AND SubNo = @SubNo AND (StartDate < @StartDate AND @StartDate < EndDate) --在期间的情况 OR (StartDate < @EndDate AND @EndDate < EndDate) --在期间的情况 OR (@StartDate< StartDate AND EndDate < @EndDate) --包括的情况