可能的重复项:
同一表中两条记录之间的日期差异
我是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;
事实证明,这对我来说是一个复杂的查询。 但是因为这是我第一次从事 Access 工作,所以我从一开始就不知道所有事情。我计算了上一个时间,并将其用作相应注销时间记录的登录时间。
现在,我的目标是计算每个员工 ID 的总持续时间。我使用了以下代码。但它需要我不确定的分组依据子句。
Format((Sum([Duration])-Int(Sum([Duration]))),"hh:nn:ss") AS TotalTime
此总时间将基于每月。
任何帮助将不胜感激。 我走错了路吗? 我应该为此目的使用 VBA 并进行报告吗?
我找到了如下解决方案,但查询花费了太多时间,几乎一分钟。我认为这是因为多次转换。任何想法如何优化此查询。哪个功能的时间转换更快?表中 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);