2013-06-24 181 views
0

我需要從一個表格計算總工作時間。我的問題是工作時間有時會在月底結束,我需要每個月的工作時間。 下面是一些示例數據:
每月計算工作時間。 MS Access

StartTime EndTime  Staff 
3/31 16:50 3/31 19:30  B 
3/31 23:10 4/1 01:30  B 
4/1 01:40 4/1 03:55  B 

結果應該是提前

Month Staff  WorkingHours 
March  B   3:30 
April  B   1:30 

感謝

回答

1

在這個問題上有兩種記錄:

  1. 記錄中,其中[開始時間]和[停止時間]是在同一個月,並

  2. 記錄,他們都沒有。

計算運行時間對於第一種情況很容易:

SELECT 
    Staff, 
    Month([StartTime]) AS WorkMonth, 
    DateDiff("n", [StartTime], [EndTime]) AS MinutesWorked 
FROM WorkLog 
WHERE Month([EndTime])=Month([StartTime]) 

計算爲跨越一個月邊界記錄經過的時間是一個過程分爲兩個部分:

(我)獲得逝去的時間早一個月

SELECT 
    Staff, 
    Month([StartTime]) AS WorkMonth, 
    DateDiff("n", [StartTime], DateSerial(Year([StartTime]), Month([StartTime]) + 1, 1)) AS MinutesWorked 
FROM WorkLog 
WHERE Month([EndTime])>Month([StartTime]) 

(二)獲取followi經過的時間NG月

SELECT 
    Staff, 
    Month([EndTime]) AS WorkMonth, 
    DateDiff("n", DateSerial(Year([EndTime]), Month([EndTime]), 1), [EndTime]) AS MinutesWorked 
FROM WorkLog 
WHERE Month([EndTime])>Month([StartTime]) 

因此,要獲得總計我們只是UNION ALL三個查詢,幷包起來的聚集查詢執行SUM()

SELECT WorkMonth, Staff, SUM(MinutesWorked) AS TotalMinutes 
FROM 
    (
     SELECT 
      Staff, 
      Month([StartTime]) AS WorkMonth, 
      DateDiff("n", [StartTime], [EndTime]) AS MinutesWorked 
     FROM WorkLog 
     WHERE Month([EndTime])=Month([StartTime]) 
     UNION ALL 
     SELECT 
      Staff, 
      Month([StartTime]) AS WorkMonth, 
      DateDiff("n", [StartTime], DateSerial(Year([StartTime]), Month([StartTime]) + 1, 1)) AS MinutesWorked 
     FROM WorkLog 
     WHERE Month([EndTime])>Month([StartTime]) 
     UNION ALL 
     SELECT 
      Staff, 
      Month([EndTime]) AS WorkMonth, 
      DateDiff("n", DateSerial(Year([EndTime]), Month([EndTime]), 1), [EndTime]) AS MinutesWorked 
     FROM WorkLog 
     WHERE Month([EndTime])>Month([StartTime]) 
    ) 
GROUP BY WorkMonth, Staff 

,將返回...

WorkMonth Staff TotalMinutes 
--------- ----- ------------ 
     3 B    210 
     4 B    225 

...如果您想調整月份的格式(例如,文本)或總時間(例如,您可以添加Format()函數作爲「hh:nn」)。

+0

+1因爲使用SQL總比通過記錄集更可取。 – Clon

+0

非常感謝。這完美地解決了我的問題。 – user2515536

0

你可能想尋找到一個邏輯語句中使用datediff() from here.它允許您輕鬆減去幾個月,幾天,幾小時等。

如果你要在初始If-Else問補充:

If DateDiff("m", #Date1#, #Date2#) = 0 Then 

    'The times here would be in the same month 

Else 

    `The times here would split months 

End If 

如果你不想在VBA使用邏輯語句,你還可以運行則DateDiff()查詢。

我不確定您在這裏處理了多少條記錄,因此如果您有1000個1000的數據循環播放每個記錄可能不是最有效的,但它會完成工作。如果您不熟悉VBA方法,我會很樂意用更多的數據修改我現有的If-Else,以指導您正確的方向。