在Access中构建查询

时间:2012-12-14 02:41:36

标签: ms-access time ms-access-2010

我需要进行查询,以显示一个人留在办公室的时间。 我有一个列表,创建一个人在办公室进入的记录和 办公室外的人员的记录和其他记录。 我有一些困难,因为一个人可以在同一天进出多次,有时一个人没有注册你的进入或退出。 按照示例

╔════════════╦════════════╦════════════════════╦═════════════════╦═════════╦═══════╗
║ Local Date ║ Local Time ║      Employee      ║     Office      ║ Catraca ║ Staus ║
╠════════════╬════════════╬════════════════════╬═════════════════╬═════════╬═══════╣
║ 11/7/2012  ║ 10:16      ║ SILVA ,ANDRE BRAGA ║ Alexandre Duma  ║     002 ║ In    ║
║ 11/7/2012  ║ 13:03      ║ SILVA ,ANDRE BRAGA ║ Alexandre Dumas ║     004 ║ Out   ║
║ 11/7/2012  ║ 15:19      ║ SILVA ,ANDRE BRAGA ║ Alexandre Dumas ║     004 ║ Out   ║
║ 11/7/2012  ║ 15:25      ║ SILVA ,ANDRE BRAGA ║ Alexandre Dumas ║     004 ║ In    ║
║ 11/7/2012  ║ 18:31      ║ SILVA ,ANDRE BRAGA ║ Alexandre Dumas ║     004 ║ Out   ║
║ 11/7/2012  ║ 18:40      ║ SILVA ,ANDRE BRAGA ║ Alexandre Dumas ║     004 ║ In    ║
║ 11/7/2012  ║ 19:56      ║ SILVA ,ANDRE BRAGA ║ Alexandre Dumas ║     004 ║ Out   ║
╚════════════╩════════════╩════════════════════╩═════════════════╩═════════╩═══════╝

在这个例子中,这个人在办公室里待了07:09小时

Regads 安德烈

1 个答案:

答案 0 :(得分:0)

好的,总结起来相当容易。在没有匹配时间戳的情况下消除时间戳更加困难。

至于总数:日期&时间内部存储为数字。假设没有人在午夜工作,那么你所要做的就是将所有“In”时间加起来并从所有“Out”时间中减去。像这样:

SELECT [TotOut]-[TotIn] AS TotHours, *
FROM (SELECT CheckIn.Employee, CheckIn.[Local Date], Sum(CheckIn.[Local Time]) AS [TotIn]
FROM CheckIn
WHERE (((CheckIn.Staus)="In"))
GROUP BY CheckIn.Employee, CheckIn.[Local Date])  AS TotIn INNER JOIN (SELECT CheckIn.Employee, CheckIn.[Local Date], Sum(CheckIn.[Local Time]) AS [TotOut]
FROM CheckIn
WHERE (((CheckIn.Staus)="Out"))
GROUP BY CheckIn.Employee, CheckIn.[Local Date])  AS TotOut ON (TotIn.Employee = TotOut.Employee) AND (TotIn.[Local Date] = TotOut.[Local Date]);

消除不匹配的时间是可能的,但很难。此查询执行大部分操作。但是,它正在跳过第一条记录,因此需要调整。

SELECT A.ID, A.[Local Time], B.[Local Time] AS [Prev Time], A.Staus
FROM CheckIn AS A LEFT JOIN CheckIn AS B ON (A.Employee = B.Employee) AND (A.[Local Date] = B.[Local Date])
WHERE (((B.[Local Time])=DMax("[local time]","[checkin]","[local time] < #" & [a].[Local Time] & "#")) AND ((A.Staus)<>[b].[staus]))
ORDER BY A.[Local Time];

此外,您还需要首先创建一个记录集,该记录集会跳过任何以“Out”状态开头的记录。 Here's an article that may help