2013-04-16 29 views
1

數據來源Emp表:ORACLE SQL查詢僅重疊時限

NUM DEPT HIRED_SDT      HIRED_EDT 
--- ----- ------------------------------ ------------------------------ 
1 Sales October, 01 2012 11:00:00+0000 October, 01 2012 11:30:00+0000 
2 Sales October, 01 2012 11:22:00+0000 October, 01 2012 12:40:00+0000 
3 Sales October, 01 2012 13:00:00+0000 October, 01 2012 13:50:00+0000 
4 CC  October, 01 2012 14:00:00+0000 October, 01 2012 15:00:00+0000 
5 CC  October, 01 2012 15:00:00+0000 October, 01 2012 16:10:00+0000 
6 CC  October, 01 2012 16:00:00+0000 October, 01 2012 17:20:00+0000 

所需的結果:

只有重疊時限每DEPARTEMENT分組

==>例如。內Sales有2出3條重疊

NUM DEPT HIRED_SDT      HIRED_EDT 
--- ----- ------------------------------ ------------------------------ 
1 Sales October, 01 2012 11:00:00+0000 October, 01 2012 11:30:00+0000 
2 Sales October, 01 2012 11:22:00+0000 October, 01 2012 12:40:00+0000 
5 CC  October, 01 2012 15:00:00+0000 October, 01 2012 16:10:00+0000 
6 CC  October, 01 2012 16:00:00+0000 October, 01 2012 17:20:00+0000 

http://sqlfiddle.com/#!4/91730/1

+0

爲什麼十月-11:22和十月-12:40重疊,而13:00和13:50不是?什麼是重疊? – Art

+0

@Art:我相信,HIRED_SDT包含開始日期和HIRED_EDT結束日期。第1行和第2行的範圍重疊,因爲第2行在第1個SDT和EDT之間開始。 –

+0

@Andriy M - 謝謝Andriy,我還是不明白,但確實如此。在上面的例子中,我看到78分鐘的時間差異是重疊的,但50分鐘的時間差異不是......也許我失去了一些東西......像往常一樣做着夢...... LOL。 – Art

回答

2

你可以嘗試使用EXISTS此:

SELECT * 
FROM Emp e 
WHERE EXISTS (
    SELECT * 
    FROM Emp 
    WHERE DEPT = e.DEPT 
    AND HIRED_SDT < e.HIRED_EDT 
    AND HIRED_EDT > e.HIRED_sDT 
    AND NUM <> e.NUM 
); 

即如果存在屬於同一個部門的另一行並且該範圍與此行的範圍重疊,請選擇一行。

+0

看起來您忘記了'EXISTS'子句中的AND <> e.num',否則返回所有行。 –

+0

@PeterLang:的確,謝謝,更新。 –

+0

謝謝!這就是我一直在尋找的! – user1875323