2013-03-08 4 views
0

안녕하세요에는 다음 필드가있는 테이블을 가지고있다. 난 단지 2004 년과 2009 년SQL 제외 특정 기간

사이에 지점을 거주 한 사람을 선택합니다

: 2012-01-01

질문에 다시 2000-01-01하고 to_dt 날짜에 from_dt 날짜

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 

여기 논리에 문제가 있습니다. 누구든지 2009 년 동안 하루 이상 집에 살았던 사람들 만 포함하도록 from_dt 및 to_dt를 어떻게 사용할 수 있는지에 대한 제안을 갖고 있습니까?

대단히 감사합니다.

+0

([이 SO 답변] 확인하시기 바랍니다 (니콜라는 지적) http://stackoverflow.com/questions/325933/determine-whether-two-date-ranges- 오버랩). –

+0

@Hogan 물론입니다. OP는 '2004 년과 2009 년 사이에 어떤 지점에 살았던 사람들을 선택하려고합니다.'- 따라서 어떤 주소에 살고있는 사람의 범위가 범위 (20040101 - 20091231)와 겹쳐 야합니다. –

+0

@ NikolaMarkovinović - 너의 권리 ... 신경 쓰지 마. – Hogan

답변

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) 

또한 앞이나 뒤 모두에서 테스트 할 수 없습니다.

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

+0

죄송합니다.이 예제를 수정해야합니다. 첫 번째 범위의 시작은 두 번째 끝의 끝 앞에 있어야하며 첫 번째 끝의 끝은 두 번째 끝의 시작 뒤에 있어야합니다. 그래서 :'year (from_dt) <= 2009 and year (to_dt)> = 2004'. 성능 향상을 위해 함수를 사용하지 않는 것이 좋습니다. –

+0

감사합니다.이 업데이트 된 답변은 의미가 있습니다. – brucezepplin