2010-10-04 162 views
1

alt text需要幫助計算工作時間

的路上我設計我的工作表不幫我輕鬆地計算工時。

快照中的輸出已從多個表中收集。

不要擔心setDate和timeEntered格式。

SetDate表示工作日。 tsTypeTitle表示班次的類型,是午餐時間等。 timeEntered表示實際時間。

setDate將不得不被修剪爲只有Date和timeEntered應該只顯示時間 - 這將在稍後處理,不必擔心。

我需要抓住Shift Started和Shift End之間的區別,所以我可以計算工資。

這裏是我的情況下,查詢你想看看它:

SELECT TimeSheet.setDate, TimeSheetType.tsTypeTitle, TimeSheetDetail.timeEntered 
FROM TimeSheet 
    INNER JOIN TimeSheetDetail 
     ON TimeSheet.timeSheetID = TimeSheetDetail.timeSheetID 
    INNER JOIN TimeSheetType 
     ON TimeSheetType.timeSheetTypeID = TimeSheetDetail.timeSheetTypeID 
+0

我記得在一家保險公司實現這一點,我之前的工作....但計算不是在SQL存儲過程作爲公司的政策(如強制-30分鐘午餐)必須從另一臺服務器的另一個SQL表中檢索。 – 2010-10-04 16:58:30

回答

1

假設每個人都有相同的4個事件(移動開始/結束,午餐開始/結束),每天,你可以這樣做這個。很明顯,我已經爲您的TimeSheetType ID值做了假設。在您的版本中替換適當的ID。

SELECT t.TimeSheetID, DATEDIFF(HOUR, tsd1.timeEntered, tsd4.timeEntered) - DATEDIFF(HOUR, tsd2.timeEntered, tsd3.timeEntered) as WorkingHours 
    FROM TimeSheet t 
     INNER JOIN TimeSheetDetail tsd1 
      ON t.timeSheetID = tsd1.timeSheetID 
       and tsd1.timeSheetTypeID = 1 /* Shift Started */ 
     INNER JOIN TimeSheetDetail tsd2 
      ON t.timeSheetID = tsd2.timeSheetID 
       and tsd2.timeSheetTypeID = 2 /* Lunch Started */ 
     INNER JOIN TimeSheetDetail tsd3 
      ON t.timeSheetID = tsd3.timeSheetID 
       and tsd3.timeSheetTypeID = 3 /* Lunch Ended */ 
     INNER JOIN TimeSheetDetail tsd4 
      ON t.timeSheetID = tsd4.timeSheetID 
       and tsd4.timeSheetTypeID = 4 /* Shift Ended */ 
+0

智能解決方案...... – user311509 2010-10-04 20:39:30

1

如果你必須在數據庫中這樣做,我建議編寫一個存儲過程來計算工作時間。否則,我認爲在數據庫之外處理這種業務邏輯比較明智,就像連接到數據庫的應用程序一樣。

看看您提供的設計,您似乎缺少與存儲時間表數據相對應的用戶或個人的唯一標識符。即使您目前只爲單個用戶/人存儲數據,唯一標識符也是必需的。如果您需要爲更多用戶/人員存儲數據,則擁有唯一標識符可以實現這一點。

0

時間表明細表通常會包含人員ID。爲了簡單起見,我想這已經被省略了。

假設對於任何給定的一天,對於移位入門,午餐開始,午餐結束和輪班結束(按該順序), 中的每一個將總是有且僅有一個事件,午餐應該從總時數中排除,有沒有其他的事件類型,嘗試:

with 
(SELECT TimeSheet.setDate, 
     TimeSheetType.tsTypeTitle, 
     TimeSheetDetail.timeEntered, 
     convert(datetime,convert(varchar(10),TimeSheetDetail.timeEntered,112),112) dayEntered 
FROM TimeSheet 
    INNER JOIN TimeSheetDetail 
     ON TimeSheet.timeSheetID = TimeSheetDetail.timeSheetID 
    INNER JOIN TimeSheetType 
     ON TimeSheetType.timeSheetTypeID = TimeSheetDetail.timeSheetTypeID) 
as TS 
select dayEntered, 
     datediff(ss,max(case when tsTypeTitle = 'Shift Started' then timeEntered end), 
        max(case when tsTypeTitle = 'Shift Ended' then timeEntered end)) - 
     datediff(ss,max(case when tsTypeTitle = 'Lunch Started' then timeEntered end), 
        max(case when tsTypeTitle = 'Lunch Ended' then timeEntered end)) daysSeconds 
from TS 
group by dayEntered 
+0

感謝您的幫助! ... – user311509 2010-10-04 20:42:49