2014-07-17 74 views
0

我有一個數據庫,如下所示:比較日期範圍爲特定條目

ID | Term | Start Date | End Date 
    12   6   Jul '12  Dec '12 
    12   6   Jan '13  Jun '13 
    13   2   Jul '12  Aug '12 
    13   12  Jul '12  Jul '13 

所以每個ID的是已經達成了協議。這是一個我正在處理的數據庫,它看起來像一些數據輸入不正確。我正在嘗試編寫一個過濾器,其中顯示相同交易ID的重疊條款。例如,對於ID12,合同是從2012年7月至12月的6個月,然後再延長6個月。對於ID 13,某人輸入數據不正確,合同在同一期限內「兩次製作」,日期重疊。

所以我需要的是一個過濾器,通過ID的每個集合(不一定只有兩個,合同可以被擴展任意次數)並檢查該ID中所有日期的有效性,如上所述。我不是很原生的SQL,所以while()循環是首先想到的,但我想知道是否有更簡單的方法來應用這種過濾器?

+6

你的日期是在一個可怕的格式。他們應該存儲爲日期。如果必須將它們存儲爲字符,則使用YYYY-MM格式。這樣可以更容易地進行這種比較。 –

+1

查詢是可能的...重疊日期範圍可以被檢測到,但根據戈登這些日期格式需要克服。 – Twelfth

+0

它們是作爲日期存儲的,我只是沒有將它們複製過來,因此對此感到抱歉 – mike

回答

1

您需要查找日期範圍重疊的所有行嗎?

是否存在主鍵/此表的任何唯一標識符以避免將行與自己進行比較?

select * from vt as t1 
where exists 
(select * from vt as t2 
    where t1.id = t2.id -- same ID 
    and t1.PK <> t2.PK -- but not the same row 
    and t1.end_date >= t2.start_date -- date ranges 
    and t1.start_date <= t2.end_date -- overlap 
) 

根據你的數據,你可能需要比較更改爲</>,而不是< =/> =