0

ジョブのリストを含むデータベースがあります。たとえば、CV の以前の職務経験のリストである可能性があります。ある人が何日雇用されているか知りたいです。だから、私はこのクエリを書きました:

SELECT sum(datediff(dd,isnull(date_begin,getdate()),isnull(date_end,getdate()))+1)
  FROM jobs
 WHERE person_id=X

問題は、これらの日付が重複する場合があることです。例:

person date_from   date_to     Comment
John   01-Jan-2011 31-Dec-2012 Two years working at ABC
John   01-Jan-2012 31-Dec-2013 Two years of extra work at evening

この場合、私のクエリは 4 年を返しますが、私は 3 年だけを返したいと思います。つまり、ある人が 1 年間に 2 つの仕事をしている場合、2 年ではなく 1 年としてカウントしたいと考えています。重複するジョブは 2 だけでなく、任意の数になる可能性があります。すべての重複の合計期間を差し引いてクエリを調整しようとしました。これは 2 つの重複するジョブでうまく機能しますが、それ以上の場合は失敗します。

4

2 に答える 2

2

を使用しcteて日付のドライバー リストを作成し、それJOINを使用BETWEENして個別の日付を取得できます。このクエリが頻繁に実行される場合は、cte を使用して日付ルックアップ テーブルを作成し、インデックスを作成する価値があります。

;WITH cte AS (SELECT CAST('20100101' AS DATE) 'Dt'
              UNION ALL
              SELECT DATEADD(DAY,1,Dt)
              FROM cte
              WHERE dt <= GETDATE())   
SELECT person,MIN(b.dt),MAX(b.Dt),COUNT(DISTINCT b.dt)'Total Days'
FROM #Table a
JOIN cte b
  ON b.Dt BETWEEN a.date_from AND a.date_to            
GROUP BY person
OPTION (MAXRECURSION 0)   
于 2013-08-30T17:08:57.340 に答える