首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Access中生成查询

在Access中生成查询
EN

Stack Overflow用户
提问于 2012-12-14 10:41:36
回答 1查看 93关注 0票数 2

我需要做一个查询来显示一个人在办公室呆了多少次。我有一个列表,它创建了一个人进入办公室时的记录,以及当人离开办公室时的记录和其他记录。我有一些困难,因为一个人可以在同一天多次进入/退出,有时一个人没有注册你的进入或退出。按照示例进行操作

代码语言:javascript
复制
╔════════════╦════════════╦════════════════════╦═════════════════╦═════════╦═══════╗
║ 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   ║
╚════════════╩════════════╩════════════════════╩═════════════════╩═════════╩═══════╝

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

雷加德·安德烈

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-14 13:43:56

好了,把它加起来相当简单。在没有匹配的时间戳的情况下消除时间戳更加困难。

至于总计:日期和时间在内部存储为数字。假设没有人工作到午夜,那么你所要做的就是把所有的"In“时间加起来,再从所有的"Out”时间中减去。如下所示:

代码语言:javascript
复制
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]);

消除不匹配的时间是可能的,但很困难。这个查询完成了大部分任务。但是,它跳过了第一个记录,因此需要调整。

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13871891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档