2013-03-08 112 views
0

您好我有一個具有以下字段的表:SQL - 排除某些時段

person 
from_dt 
to_dt 
house_num 

它描述了一個人住在什麼門牌號碼,並給出了from_dt和to_dt。該from_dt追溯到2000-01-01和to_dt日期2012-01-01

問題:

我只想選擇誰已經活了2004年和2009年

之間的某一點人

即排除然而人們喜歡

person from_dt  to_dt  house_num 
----------------------------------------- 
dave 2000-01-01 2002-01-01 34 

保持這樣的人:

person from_dt  to_dt  house_num 
----------------------------------------- 
susan 2008-01-01 2009-06-01 93 

我遇到了這裏的邏輯問題。有沒有人對我如何使用from_dt和to_dt提出任何建議,以便只包括2009年期間住在一天或更多天的人?

非常感謝。

+0

請檢查[這個蘇答案(http://stackoverflow.com/questions/325933/determine-whether-two-date-ranges-交疊)。 – 2013-03-08 11:13:42

+0

@Hogan確實如此。 OP想要「選擇在2004年到2009年之間曾經居住過的人」 - 因此,某人住在某個地址的範圍必須與範圍(20040101 - 20091231)重疊。 – 2013-03-08 11:21:10

+0

@NikolaMarkovinović - 你的權利...沒關係 – Hogan 2013-03-08 11:24:01

回答

1

未測試,所以可能有錯別字,但這裏有一個想法 - 從必須在範圍內或必須在範圍內,或者他們必須開始之前和結束之後。

select * 
from table 
where (year(from_dt) < 2009 and year(from_dt) > 2004) 
    or (year(to_dt) < 2009 and year(to_date) > 2004) 
    or (year(from_dt) < 2004) and year(to_date) > 2009) 

你也可以在之前或之後都測試NOT。

select * 
from table 
where not ((year(from_date) < 2004 and year(to_dt) < 2004) 
     or(year(from_date) > 2009 and year(to_dt) > 2009)) 

或(如尼古拉指出)

select * 
from table 
where year(from_dt) <= 2009 and year(to_dt) >= 2004 
+0

這對我來說很好。只是測試它,並得到明智的數字。非常感謝。 - 剛纔注意到,這會不會包括那些在2004年之前就開始生活並且進入2004-2009研究窗口的人?我不認爲它確實如此。 – brucezepplin 2013-03-08 11:19:28

+0

對不起,我必須糾正這個例子:第一個範圍的開始必須在第二個範圍的結束之前,第一個範圍的結束必須在第二個範圍的開始之後。所以:'year(from_dt)<= 2009年和year(to_dt)> = 2004'。性能方面最好不要使用函數。 – 2013-03-08 11:33:50

+0

謝謝,這個更新的答案是有道理的 – brucezepplin 2013-03-08 11:51:47