2017-01-18 2 views
1

私は、いくつかのツールを使用しているテーブルと、雇用外の日付を持っています。SQL特定の日付まで前に雇用されているすべてのアイテムを表示します。

私は与えられた月に雇われているすべてのツールを表示したいと思います。

例えば、

tool  on_hire off_hire 
tool 1 02/01/2016 15/01/2016 
tool 2 16/12/2015 16/01/2016 
tool 3 05/01/2016 20/02/2016 

私は変数set @startdate = 20160101@enddate = 20160131

WHEREとJANに始まっすべてを取得することが可能であるがあるが、私は12月に始まったが、JAN中

を終了し、ツール2をキャプチャする必要があります

アイデア?

ヘルプははるかに高く評価され、歓声

+3

さて、実際には、2016年1月に終了したすべてを返すクエリが必要です。開始は問題ではありません。なぜツール2の例外を作るのかは明らかではありません。 –

答えて

2

は戻って私を取りますが、これは非戻された項目のフォローアップのために

select * 
from MyTable 
where on_hire < @EndDate 
and (off_hire >= @StartDate or off_hire is null) 

含め、あなたが期間中にレンタル上のすべてを表示したいものです各ツール

with CTE as 
(
    select * 
    from MyTable 
    where on_hire < @EndDate 
    and (off_hire >= @StartDate or off_hire is null) 
) 
select Tool, 
     sum(datediff(dd, 
        case 
         when off_hire > @EndDate then @EndDate 
         when off_hire is null then @EndDate 
         else off_hire 
        end, 
        case 
         when on_hire < @StartDate then @StartDate 
         else on_hire 
        end)) as DaysOnHire 
from CTE 
froup by Tool 
+0

ありがとう、これはうまくいきました。 – Andy00001

+0

私はJAN期間に雇用された日数を計算することも考えています。それを行う方法が分かっている場合のみです:-)私はそれをうまくできない場合、別の質問を作成するかもしれません。歓声 – Andy00001

+0

@ Andy00001更新を参照してください – JohnHC

1

日間の合計数は、この

SELECT * FROM TABLE1 
WHERE on_hire BETWEEN @startdate AND @enddate 
OR off_hire BETWEEN @startdate AND @enddate 
のように試してみてください
+0

これは正しいですか? OPはそれについて言及していない。なぜ単にWHERE off_hire <= @enddate 'でないのですか –

+0

アイテムが開始日前に雇われ、終了日後に返されるとどうなりますか?これは商品を一切表示しません – JohnHC

+0

彼は開始日と終了日の間にすべての可能性レコードを必要とします。@ TimSchmelter –

0

それは3つの選択肢でなければなりません

create table #yourtable (tools varchar(50),on_hire datetime,off_hire datetime) 

insert into #yourtable 

select 'tool1' ,'2016-01-02' ,'2016-01-15' 
union all 
select 'tool2' , '2015-12-16' ,'2016-01-16' 
union all 
select 'tool3' , '2016-01-05', '2016-02-20' 

select * from #yourtable 
where datepart(mm,on_hire)='01' and tools<>'tool2' 
union all 
select * from #yourtable 
where datepart(mm,on_hire)='12' and datepart(mm,off_hire)='01' and tools='tool2' 
-1

この文字列で検索してください:

x1 <= y2 and y1 <= x2 

だから、次の場合に交差

 
1.  |______| --hire time 
    s|—————|e 

2.  |______| --hire time 
      s|—————|e 

3.  |______|--hire time 
    s|—————————————|e 


4.  |______|--hire time 
     s|———|e --included in 2 and 3 
DECLARE @startdate date = '01/01/2016', @enddate DATE = '01/31/2016' 
    ;WITH tb(tool,on_hire,off_hire)AS(
     SELECT 'tool 1','01/02/2016','01/15/2016' UNION        
     SELECT 'tool 2','12/16/2015','01/16/2016' UNION  
     SELECT 'tool 3','01/05/2016','02/20/2016' 
    ) 
    SELECT * FROM tb 
    WHERE 
    DATEDIFF(d,tb.on_hire,@startdate)>0 AND DATEDIFF(d,@startdate,tb.off_hire)>0 
    OR DATEDIFF(d,tb.on_hire,@enddate)>0 AND DATEDIFF(d,@enddate,tb.off_hire)>0 
    OR DATEDIFF(d,tb.on_hire,@startdate)>0 AND DATEDIFF(d,tb.off_hire,@enddate)>0 
+0

これは、説明されているシナリオでは非常に複雑です。 – JohnHC

+0

ケースによって重複を分析すると、複雑な条件が発生する傾向があります。実際には、2つの期間(ここでは報告期間と雇用期間など)が重なっているかどうかを判断するには、期間1が開始されてから期間2が終了し、期間2が期間1が終了する前に開始することのみを決定する必要があります。その後、厳密に当たる2つの期間(1の終了日が他の開始日に等しい)が重複しているとみなされるべきかどうかのみが、些細なことである。そしてそれは単にあなたの比較で '<'か '<='を使うかどうかに影響します。 –

+0

@Damien_The_Unbeliever Soooo、私はdunのようなwotのようでしたか? – JohnHC

0

2行x1-x2y1-y2(日付範囲など) :

select * from table 
where on_hire <= @enddate and @startdate <= off_hire 
関連する問題