每月计算工作时数。 MS Access

时间:2013-06-24 09:01:32

标签: 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

提前致谢

2 个答案:

答案 0 :(得分:1)

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

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

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

  3. 计算第一种情况的经过时间很简单:

    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以指出您正确的方向。