2013-02-01 139 views
0

如何編寫查詢以查找以下數據間隙。Oracle查詢查找日期間的差距,比較差距的日期範圍

--Scenario1 - 查詢1 --Find相同表內的間隙(例如表B)

ID  EFF_DT         TERM_DT 
800 6/15/2012 12:00:00.000 AM 10/14/2012 12:00:00.000 AM  -- GAP 
800 10/16/2012 12:00:00.000 AM 11/14/2012 12:00:00.000 AM 
800 11/15/2012 12:00:00.000 AM 12/31/9999 12:00:00.000 AM 

--Scenario2 - 2個表(表A,表B)之間QUERY2 --Find錯配

-- tablea , sample data below 
ID  EFF_DT         TERM_DT 
400 6/15/2012 12:00:00.000 AM 10/14/2012 12:00:00.000 AM  
400 11/15/2012 12:00:00.000 AM 12/31/9999 12:00:00.000 AM 

500 6/15/2012 12:00:00.000 AM 10/14/2012 12:00:00.000 AM  
500 10/15/2012 12:00:00.000 AM 11/14/2012 12:00:00.000 AM  
500 11/15/2012 12:00:00.000 AM 12/31/9999 12:00:00.000 AM 

-- tableb, sample data below 
ID  EFF_DT         TERM_DT 
400 6/15/2012 12:00:00.000 AM 10/13/2012 12:00:00.000 AM  -- mismatch 
400 11/15/2012 12:00:00.000 AM 12/31/9999 12:00:00.000 AM 

500 6/15/2012 12:00:00.000 AM 11/14/2012 12:00:00.000 AM  
500 11/15/2012 12:00:00.000 AM 12/31/9999 12:00:00.000 AM 


-- Note 400 is a mismatch since ranges are different in both tables, 500 is okay (even though rows are split they still match) 
-- Need to identify ID 400 

這些表格有時有1/1/1753用於低日期和12/31/9999用於高日期。

嘗試了以下查詢,但它引發了第一種情況的oracle錯誤。 [ORA-01841:(全)年份必須-4713和+9999之間,而不是0]

SELECT ID, TERM_DT AS gap_lower_bound, next_date AS gap_upper_bound 
    FROM (SELECT t.*, 
       LEAD (EFF_DT) 
        OVER (PARTITION BY ID ORDER BY EFF_DT) 
        next_date 
      FROM TABLEB t) 
WHERE          -- trim(next_date) is not null and 
     next_date > TERM_DT + 1 

謝謝。

+1

第一,這似乎是兩個不同的問題 - 您應該創建第二個問題,並從這裏刪除第二個問題。 「EFF_DT」和「TERM_DT」的數據類型是什麼?這些名稱暗示它們是「DATE」列。但數據與「DATE」不一致 - 「DATE」沒有小數秒。它是一個'TIMESTAMP'嗎?一個'VARCHAR2'?還有別的嗎? –

+0

其時間戳字段,用作日期。謝謝 – user2031030

回答

1

爲Scenario1 ,, 讓作爲樣品,

ID EFF_DT   TERM_DT 
____________________________________ 
    800 15-JUN-12 14-OCT-12 --GAP 
    800 16-OCT-12 14-NOV-12 
    800 15-NOV-12 31-DEC-12 
    800 01-JAN-13 01-FEB-13 --GAP 
    800 03-FEB-13 01-MAR-13 

查詢可能是

SELECT term_dt 
FROM 
    (SELECT t.*, 
      lead(eff_dt,1) OVER (ORDER BY eff_dt) AS next_date 
    FROM lead_test t 
    ) 
WHERE term_dt+1<>next_date; 

這導致:

term_dt 
__________ 
14-OCT-12 
01-FEB-13 

爲scenario2:

作爲select to_date('12/31/9999', 'mm/dd/yyyy')+1 from dual;拋出了同樣的錯誤,

你得到ORA-01841錯誤是由於你在TERM_DT + 1 where子句中使用的條件,因此,更好地你應該改變/降低12/31/9999值那些,

+0

如果我們在'31-DEC-12'和'02-JAN-2013'之後有差距,它會起作用嗎? – SparKot

+0

根據上述查詢,它檢查TERM_DT的第二天和下一行的EFF_DT是否相等,如果不相等,則TERM_DT被視爲OP所需的GAP。所以如果在31-DEC-12和/或02-JAN-2013之後有差距,它應該可以工作。 – ajmalmhd04