根据日期时间和布尔字段将表与自身进行比较

时间:2014-06-05 15:34:58

标签: sql sql-server-2012

我有一个表,我正在尝试查找计划在相同开始和结束时间的项目,并且有两个布尔字段指示计划冲突。这里的表格看起来很像没有多余的东西:

id | RecordNo | Starttime | Endtime | Description | Bool1 | Bool2    

现在,这些记录有不同的RecordNo,但如果两个记录具有相同的DescriptionStarttimeEndtime,并且一条记录的Bool1为FALSE且另一条记录的Bool2为TRUE,反之亦然,这将是一个时间表冲突。

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

完全相同的开始时间和结束时间的碰撞

with records as(
 select starttime, endtime from table group by starttime, endtime where count(starttime)>1
)
select recordno from table t
 inner join records r on t.starttime=r.starttime and t.endtime=r.endtime

但我认为你也可能想要重叠碰撞

select t1.recordno 
from table t1 
inner join table t2 
on (t1.starttime between t2.starttime and t2.endtime) 
   or 
   (t1.endtime between t2.starttime and t2.endtime) 

这有点危险,因为它会将表中的每条记录连接到表中的每条记录。如果表中有10行,则会在将其缩小到结果之前创建100行。对于100行,它将创建10000行,然后缩小到您的结果。

行^ 2

根据您的上一条评论,您可能希望根据描述和不同的布尔值以及在这种情况下获取重复交易的确切时间进行第二种方法

select t1.recordno 
from table t1 
inner join table t2 
on t1.starttime=t2.starttime 
   and t1.endtime=t2.endtime 
   and t1.description=t2.description 
   and t1.Bool1 != t2.Bool1
   and t1.Bool2 != t2.Bool2