0

我需要从一个表中计算总工作时间。我的问题是工作时间有时会在月底过去,我需要每个月的工作时间。以下是一些示例数据:

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

提前致谢

4

2 回答 2

1

在这个问题中有两种记录:

  1. 记录 [StartTime] 和 [StopTime] 在同一月份的位置,以及

  2. 记录他们不在的地方。

计算第一种情况的经过时间很容易:

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])

因此,要获得总数,我们只需将所有三个查询联合起来,并将它们包装在一个聚合查询中以执行 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”),您可以添加函数。

于 2013-06-24T09:55:59.193 回答
0

您可能想从这里查看使用 datediff() 的逻辑语句。 它允许您轻松减去月、日、小时等。

如果您要添加初始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 条记录中的 10 条记录,则循环遍历每条记录可能不是最有效的,但它可以完成工作。如果您不熟悉 VBA 方法,我很乐意If-Else用更多数据修改我现有的方法,以便为您指明正确的方向。

于 2013-06-24T09:47:14.700 回答