2012-10-08 30 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 

三是節日休假表:

Holiday

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_dateSymposium_end_date(作爲變量),我想選擇所有Personnel.Id_personnelPersonnel.Name可用於研討會(未休病假或假期)。

在我的例子,如果Symposium_start_date = 2012-10-02Symposium_end_date = 2012-10-06其結果必然是:

Id_personnel   Name 
1     John 
3     Tom 

(你可以看到愛麗絲和查爾斯都在休病假和Ben度假)

謝謝!

+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

這是一個僅用於醫療表的示例。您可以輕鬆地添加假日

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

假設MS-SQL,類似於人,但已經顯示錶聯合在一起,和子查詢,顯示所有與研討會日期那些誰衝突 - 我認爲這是比較容易先寫 - 然後選擇所有沒有衝突的人。問候!

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

相關問題