如何編寫查詢以查找以下數據間隙。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
謝謝。
第一,這似乎是兩個不同的問題 - 您應該創建第二個問題,並從這裏刪除第二個問題。 「EFF_DT」和「TERM_DT」的數據類型是什麼?這些名稱暗示它們是「DATE」列。但數據與「DATE」不一致 - 「DATE」沒有小數秒。它是一個'TIMESTAMP'嗎?一個'VARCHAR2'?還有別的嗎? –
其時間戳字段,用作日期。謝謝 – user2031030