2012-10-08 5 views
3

3 개의 테이블이 있습니다.특정 기간 동안 사용할 수있는 인력을위한 SQL SELECT

Personnel

Id_personnel   Name 
1     John 
2     Alice 
3     Tom 
4     Charles 
5     Ben 

둘째는 병가와 테이블 : 첫 번째는 직원의 목록입니다

Medical

Id_personnel   Start_date   End_date 
3     2012-08-02   2012-08-05 
2     2012-08-02   2012-08-15 
4     2012-10-04   2012-10-06 
2     2012-10-02   2012-10-15 
2     2012-09-20   2012-09-21 

셋째 휴일 휴가와 테이블입니다 :

표,210

Id_personnel   Start_date   End_date 
3     2012-08-02   2012-08-05 
2     2012-02-02   2012-02-15 
5     2012-10-01   2012-10-05 

나는 두 개의 이벤트 날짜가 : Symposium_start_date와 (변수 등) Symposium_end_date을 나는 심포지엄 (안 병가 또는 휴가)에 대한 모든 Personnel.Id_personnelPersonnel.Name 사용할 선택하고 싶습니다. 내 예에서

Symposium_start_date = 2012-10-02Symposium_end_date = 2012-10-06 경우 결과는 다음과 같아야합니다 :

Id_personnel   Name 
1     John 
3     Tom 

감사합니다 (당신이 앨리스와 찰스 휴가 병가와 벤에있는 볼 수 있습니다)!

+4

이 유형의 쿼리의 경우 데이터베이스를 지정해야합니다. 날짜 중첩은 Oracle 및 MS SQL Server 등에서 다르게 처리됩니다. –

+0

죄송합니다. 이것은 MS SQL입니다. –

답변

2

MS SQL 서버의 경우.

declare @start date = '2012-10-02', @end date = '2012-10-10' 

select personnel.* 
from personnel 
    left join holiday on personnel.Id_personnel = holiday.Id_personnel 
     and holiday.start_date<[email protected] 
     and holiday.end_date>[email protected] 
    left join medical on personnel.Id_personnel= medical.Id_personnel 
     and medical.start_date<[email protected] 
     and medical.end_date>[email protected] 
where holiday.Id_personnel is null 
and medical.Id_personnel is null 
+0

예! 그것은 효과가있다. 나는이 해결책을 사용할 것이다! 고맙습니다! –

0

의료용 테이블의 예입니다. 당신은 심포지엄 날짜와 모든 사람 충돌을 보여줍니다 쉽게 휴일 다른 유사 MS-SQL을, 가정

declare @Symposium_start_date datetime 
declare @Symposium_end_date datetime 

set @Symposium_start_date = '2012-08-01' 
set @Symposium_end_date = '2012-08-04' 


select * 
from personel p left join medical m on p.Id_personel = m.Id_personel 
where (@Symposium_start_date > m.end_date) or (@Symposium_end_date<m.start_date) 
1

을 추가 할 수 있지만 테이블이 함께 UNION을 보여 주었다, 그리고 하위 쿼리 -이 처음 쓰기 쉽게 생각 - 충돌하지 않는 사람들을 모두 선택하십시오. 문안 인사!

declare @Symposium_start_date date = '2012-10-02' 
declare @Symposium_end_date date = '2012-10-06' 

select * from Personnel P where p.Id_personnel not in (
    select Id_personnel from (
     select m.Id_personnel, m.Start_date, m.End_date 
     from Medical M 
     union 
     select h.Id_personnel, h.Start_date, h.End_date 
     from Holiday H 
    ) as Leave 
    where (Start_date between @Symposium_start_date and @Symposium_end_date) 
     or (End_date between @Symposium_start_date and @Symposium_end_date) 
     or (Start_date <= @Symposium_start_date and End_date >= @Symposium_end_date) 
) 
+0

사람의 휴가가 심포지엄에 시작되어 그 후에 끝나면 어떨까요? – podiluska

+0

아주 사실, 지금 추가했습니다. – Chalky

+0

그리고 @podiluska, 나는 너의 데이트 선택 방식이 내 것보다 낫다! – Chalky

관련 문제