2011-04-25 112 views
0

我想知道SQL語句,以涵蓋以下問題。我在這裏有一些問題。如何編寫SQL語句?

SupplierID ContractStart ContractEnd   

20   1/1/2010  1/3/2010 
24   12/12/2008  12/1/2009 
31   13/1/2008  13/2/2008 
20   13/1/2008  13/2/2008 
24   11/11/2007  11/12/2010 
31   12/12/2008  1/1/2009 

請在此表中標識重疊合同的供應商ID。

回答

1

如果你的表是t,這應該這樣做:

select a.supplierid, b.supplierid 
from t a, t b 
where ((b.contractstart<a.contractend and b.contractend>a.contractend) 
    or (a.contractstart<b.contractstart and a.contractend>b.contractstart)) 
    and a.supplierid<b.supplierid -- strict so you don't get doubles 

編輯:這是假設你的ID重複的錯別字。

0
SELECT a.sid 
FROM contracts a, contracts b 
WHERE a.sid == b.sid 
AND a.start < b.start 
AND a.end > b.start; 
0

如果您正在尋找通過供應商ID來識別重疊這應該工作:

FYI我用MM/DD/YYYY

declare @contract table (SupplierID int, ContractStart datetime, ContractEnd datetime) 

insert into @contract 
select 20, '1/1/2010', '3/1/2010' 
union all 
select 24 , '12/12/2008', '1/12/2009' 
union all 
select 31, '1/13/2008 ', '2/13/2008' 
union all 
select 20, '1/13/2008', '2/13/2008' 
union all 
select 24, '11/11/2007 ', '12/11/2010' 
union all 
select 31, '12/12/2008 ', '1/1/2009' 

SELECT a.supplierid, 
     a.contractstart, 
     a.contractend, 
     b.contractstart, 
     b.contractend 
FROM @Contract a 
     INNER JOIN @Contract b 
     ON b.supplierid = a.supplierid 
WHERE (b.contractstart < a.contractend) 
     AND (b.contractend > a.contractstart) 
     AND (b.contractstart != a.contractstart --Ignore overlap with self 
      AND b.contractend != a.contractend) 
     AND b.contractstart > a.contractstart -- No Duplicates