1

ディレクターが働いたときにヘルパーが働いたかどうかに基づいてヘルパーに支払うディレクターがいます。

次のように 2 つのビューがあります。

監督

Name    TimeIn                      TimeOut

Bob     2012-07-17 07:00:00.000     2012-07-17 16:00:00.000
Sam     2012-07-17 10:00:00.000     2012-07-17 20:00:00.000
Beatly  2012-07-17 14:00:00.000     2012-07-17 23:00:00.000
Mac     2012-07-17 21:00:00.000     2012-07-18 07:00:00.000 

ヘルパー

Name    TimeIn                      TimeOut
Fred    2012-07-17 15:59:00.000     2012-07-18 00:19:00.000

その期間に誰が働いていたのかを突き止めることは、難しいことではありません。少なくとも、頭の中で問題を抱えているわけではありません。これは、どこで、何分、誰によって、これが分ごとに重複しているかを見つけることです。そして、それらを使用時間ごとにグループ化します。彼らは皆、時給を書記と分割するからです。したがって、理想的には次のような結果になります。

DirName HelperStart                 HelperEnd
Bob     2012-07-17 15:59:00.000     2012-07-17 16:00:00.000
Sam     2012-07-17 15:59:00.000     2012-07-17 16:00:00.000
Beatly  2012-07-17 15:59:00.000     2012-07-17 16:00:00.000
Sam     2012-07-17 16:01:00.000     2012-07-17 20:00:00.000
Beatly  2012-07-17 16:01:00.000     2012-07-17 20:00:00.000
Beatly  2012-07-17 20:01:00.000     2012-07-17 21:00:00.000
Beatly  2012-07-17 21:01:00.000     2012-07-17 23:00:00.000
Mac     2012-07-17 21:01:00.000     2012-07-17 23:00:00.000
Mac     2012-07-17 23:01:00.000     2012-07-18 00:19:00.000

SQL Server 2008 を使用しています。必要最小限の単純な内訳で十分だと思います。誰かが時間と競合しているかどうかを確認するのに十分なクエリが見つかりましたが、上記の内訳はありません。

4

1 に答える 1

1

私が正しく理解していれば、これは単なる「単純な」結合であり、重複する時間間隔を使用しています。2番目の部分は、ヘルパーがディレクターの時間と重なる期間を測定することです。この期間は、ディレクターとヘルパーのTimeInの遅い方から始まり、TimeOutの早い方で終わります。

次のクエリはこのロジックをキャプチャしていると思います。

select d.name as DirectorName, h.name as HelperName,
       (case when d.timeIn > h.timeIn then d.timeIn else h.timeIn end) as HelperStart,
       (case when d.timeOut > h.timeOut then h.timeOut else d.timeOut end) as HelperEnd
from director d join
     helper h
     on d.timeIn < h.timeOut and
        d.timeOut >= h.timeIn
于 2012-09-07T20:48:37.097 に答える