我需要從一個表格計算總工作時間。我的問題是工作時間有時會在月底結束,我需要每個月的工作時間。 下面是一些示例數據:
每月計算工作時間。 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
感謝
我需要從一個表格計算總工作時間。我的問題是工作時間有時會在月底結束,我需要每個月的工作時間。 下面是一些示例數據:
每月計算工作時間。 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
感謝
在這個問題上有兩種記錄:
記錄中,其中[開始時間]和[停止時間]是在同一個月,並
記錄,他們都沒有。
計算運行時間對於第一種情況很容易:
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」)。
你可能想尋找到一個邏輯語句中使用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
,以指導您正確的方向。
+1因爲使用SQL總比通過記錄集更可取。 – Clon
非常感謝。這完美地解決了我的問題。 – user2515536