一道很贱的面试题

数据库有某表有三个主键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)     --包括的情况 

 

posted on 2014-07-25 19:42  零℃弥合  阅读(157)  评论(0编辑  收藏  举报

导航