2012-09-07 71 views
1

我有導演根據助理是否工作或者導演沒有工作時支付傭工。SQL查詢比較日期時間重疊並顯示它們

有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.我希望簡單的骨架分解就足夠了。找到足夠的查詢來查看是否有人與時間衝突,但沒有發現上述情況。

+0

我不知道,有人可以在發生什麼事了,但我不明白你的結果的日期。也許更少的記錄,更多的細節會有所幫助。即使發佈你現在嘗試過的內容也不錯。 (它有助於瞭解表和現有查詢是如何建立起來的) –

+0

幫助「屬於」導演,你會如何知道這一點?如果沒有這個,那麼我想象一個導演的衝突與多於一個幫手的重疊時間。 –

+1

您確實應該將該結束時間戳存儲並用作_exclusive_上限。把它想象成「這個人不在這裏的第一個瞬間」,而不是「這個人在這裏的最後一刻」。 –

回答

1

如果我理解正確,這只是一個「簡單」的連接,您正在使用重疊的時間間隔。第二部分是衡量輔助者與導演時間重疊的時期。這段時間從導演和助手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