3

私は3つのテーブルを持っています。最初のものは人員のリストです:

テーブルPersonnel

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

2つ目は、病欠のあるテーブルです。

テーブル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

3番目は休日休暇のあるテーブルです:

テーブル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

私には2つのイベントの日付があります:Symposium_start_dateSymposium_end_date(変数として)そして私はすべてを選択し、シンポジウムに利用できるようにしたいと思いますPersonnel.Id_personnelPersonnel.Name病欠や休日ではありません)。

私の例では、ifSymposium_start_date = 2012-10-02Symposium_end_date = 2012-10-06結果は次のようになります。

Id_personnel         Name
1                    John
3                    Tom

(ご覧のとおり、アリスとチャールズは病欠で、ベンは休暇中です)

ありがとうございました!

4

3 に答える 3

2

MSSQLサーバーの場合。

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<=@end
        and holiday.end_date>=@start
    left join medical on personnel.Id_personnel= medical.Id_personnel
        and medical.start_date<=@end
        and medical.end_date>=@start
where holiday.Id_personnel is null  
and medical.Id_personnel is null
于 2012-10-08T08:55:20.727 に答える
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)
)   
于 2012-10-08T09:20:25.357 に答える
0

これは、Medicalテーブルのみの例です。あなたは簡単に休日を追加することができます

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)
于 2012-10-08T08:58:57.423 に答える