我需要从单个表中计算总工作时间。我的问题是工作时间有时会在月末过去,我需要每个月的工作时间。
以下是一些示例数据:
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
提前致谢
答案 0 :(得分:1)
在这个问题中有两种记录:
记录[StartTime]和[StopTime]在同一个月的位置,
记录他们不在的地方。
计算第一种情况的经过时间很简单:
SELECT
Staff,
Month([StartTime]) AS WorkMonth,
DateDiff("n", [StartTime], [EndTime]) AS MinutesWorked
FROM WorkLog
WHERE Month([EndTime])=Month([StartTime])
计算跨越月边界的记录的经过时间分为两个部分:
(i)获取前一个月的经过时间
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])
(ii)获取下个月的经过时间
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
...如果您想调整月份的格式(例如,作为文字)或总时间(例如“hh:nn”),您可以添加Format()
个功能。
答案 1 :(得分: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()查询。
我不确定你在这里处理的记录有多少,所以如果你有10个1000,那么循环遍历每个记录可能不是最有效的,但是它可以完成工作。如果您不熟悉VBA方法,我很乐意使用更多数据修改现有If-Else
以指出您正确的方向。