2

可能重复:
同一表中两条记录之间的日期差异

我是 MS Access 的新手,知道一点 SQL,这是我在这里的第一个问题。在提出问题之前,我进行了很多搜索以找到合适的解决方案。这是场景:

我有一个具有以下结构的表:
RCDID-- EmployeeID-- LogDate-- LogTime-- terminalID-- InOut
1 -----------2001---------1/4 /2012---15:39:27----iGuard3A-----IN
2 -----------2023---------1/4/2012-- -15:45:27----iGuard3A-----IN
3 -----------2001---------1/4/2012---15:47 :29----iGuard3A-----Out

最后的要求是获取每个员工 id 每个月的总工作时间。主要问题是登录和注销时间在不同的记录上。但我已经这样做了,我的意思是我写了一个 sql 来为每个登录注销时间间隔计算另一个。使用其他一些标准,我的 sql 如下:

SELECT AccessLog.EmployeeID, 
       AccessLog.LogDate, 
       AccessLog.TerminalID, 
       AccessLog.LogTime,   
       Format((SELECT MAX(LogTime) 
               FROM AccessLog AS Alias  
               WHERE Alias.LogTime < AccessLog.LogTime 
               AND Alias.EmployeeID = AccessLog.EmployeeID 
               AND Alias.LogDate = AccessLog.LogDate 
               AND AccessLog.TerminalID <> "iGuard1A" 
               AND AccessLog.TerminalID  <> "iGuard1B" 
               AND AccessLog.EmployeeID LIKE "2*"),"hh:nn:ss") AS PrevTime,
       Format((ElapsedTime([PrevTime],[LogTime])),"hh:nn:ss") AS Duration,
       AccessLog.InOut
FROM AccessLog
WHERE AccessLog.TerminalID <> "iGuard1A" 
AND AccessLog.TerminalID <> "iGuard1B" 
AND AccessLog.EmployeeID LIKE "2*" 
AND AccessLog.InOut = "OUT"
ORDER BY AccessLog.EmployeeID, AccessLog.LogDate, AccessLog.LogTime;

事实证明,这对我来说是一个复杂的问题。但因为这是我第一次在访问方面工作,所以我从一开始就没有意识到一切。我计算了 prevtime 并将其用作相应注销时间记录的登录时间。

现在我的目标是计算每个员工 ID 的总持续时间。我使用了以下代码。但它需要我不确定的 group by 子句。

Format((Sum([Duration])-Int(Sum([Duration]))),"hh:nn:ss") AS TotalTime

这个总时间将基于每个月。

任何帮助将不胜感激。我是不是走错了路。我应该为此目的使用 vba 和报告吗?

4

1 回答 1

0

我找到了如下解决方案,但是查询花费了太多时间,几乎一分钟。我认为这是因为多次转换。知道如何优化此查询。哪个函数的时间转换更快?表中 logtime 的数据类型是日期/时间,我应该将其更改为任何其他类型,如文本吗?

SELECT EmployeeID,
       month(LogDate), 
       SUM(int(DateDiff("s",  '00:00:00',Duration))) AS abc
       FROM (SELECT AccessLog.EmployeeID, 
                    AccessLog.LogDate, 
                    AccessLog.TerminalID, 
                    AccessLog.LogTime, 
                    Format((SELECT max(LogTime) 
                          FROM AccessLog AS Alias 
                          WHERE Alias.LogTime < AccessLog.LogTime 
                                AND Alias.EmployeeID = AccessLog.EmployeeID 
                                AND Alias.LogDate = AccessLog.LogDate 
                                AND (Alias.TerminalID)<>"iGuard1A" 
                                And (Alias.TerminalID)<>"iGuard1B"  
                                AND Alias.EmployeeID = AccessLog.EmployeeID),
                    "hh:nn:ss")  AS PrevTime, 
                    Format((ElapsedTime(iif(PrevTime = '',logtime,prevtime),[LogTime])),"hh:nn:ss") AS Duration, 
                    AccessLog.InOut 
            FROM AccessLog 
            WHERE (((AccessLog.TerminalID)<>"iGuard1A" 
            And (AccessLog.TerminalID)<>"iGuard1B") 
            AND ((AccessLog.EmployeeID) Like "2*") 
            AND ((AccessLog.InOut)="OUT")) 
ORDER BY AccessLog.EmployeeID, AccessLog.LogDate, AccessLog.LogTime) 
GROUP BY EmployeeID, month(LogDate);
于 2012-08-11T10:44:36.537 回答