Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database MS Access查询考勤时间输入/输出_Database_Vba_Ms Access - Fatal编程技术网

Database MS Access查询考勤时间输入/输出

Database MS Access查询考勤时间输入/输出,database,vba,ms-access,Database,Vba,Ms Access,我正在做一个涉及时间和出勤管理的项目。当我从生物识别阅读器下载数据时,我得到了以下格式的记录: USERID CHECKTIME 5001 12/09/2011 09:05:34 5002 12/09/2011 09:33:13 5001 12/09/2011 13:05:53 5002 12/09/2011 13:22:24 5001 12/09/2011 14:05:22 5002 12/09/2011 14:33:53 5001 12

我正在做一个涉及时间和出勤管理的项目。当我从生物识别阅读器下载数据时,我得到了以下格式的记录:

USERID  CHECKTIME
5001    12/09/2011  09:05:34
5002    12/09/2011  09:33:13
5001    12/09/2011  13:05:53
5002    12/09/2011  13:22:24
5001    12/09/2011  14:05:22
5002    12/09/2011  14:33:53
5001    12/09/2011  18:05:09
5002    12/09/2011  17:44:34
这就是图像

我想将上述记录显示如下:, (登录、注销、登录、注销、工作时间和午休时间基于“时间”)

这就是图像


请帮助我进行此查询,

您可以按用户ID和日期分组,然后使用条件聚合:

select t.userid, datevalue(t.checktime) as [date],
  max(iif(t.counter = 0, t.checktime, null)) as Log_In,
  max(iif(t.counter = 1, t.checktime, null)) as LB_Out,
  max(iif(t.counter = 2, t.checktime, null)) as LB_In,
  max(iif(t.counter = 3, t.checktime, null)) as Log_Out,
  Format((Log_In - LB_Out) + (LB_In - Log_Out), "HH:mm:ss") as WorkTime,
  Format(LB_In - LB_Out, "HH:mm:ss") as LunchBreak
from (
  select t.*,
    (select count(*) from tablename where userid = t.userid and datevalue(checktime) = datevalue(t.checktime) and checktime < t.checktime) as counter
  from tablename as t
) as t
group by t.userid, datevalue(t.checktime)

你的意思是有一个假设,你会发现4个时间戳,进,出,出,在中间是“出,在”和午餐休息的迹象?如果是这样的话,你所能找到的任何解决方案都将非常脆弱。。。想象一下,一个人没有午休时间,或者在一天结束时吃午休时间,或者忘记打卡(使用生物识别系统登录/注销,或者……),谢谢您的快速回复。是的,正如你所看到的,我每个人有4个日志。第一个用于输入,第二个用于BrackOut,第三个用于BrackIN,第四个用于输出,或者如果某人没有午休时间,他/她的第一个日志将作为输入,最后一个日志将作为输出。除非严格必要,否则请不要使用外部图像:将输出格式复制到您的问题。请将您的评论中的其他数据放入问题中,否则其他人可能会错过它。我不是一个SQL魔术师,但我怀疑它可以在纯SQL中完成…嗨,谢谢你的声明。我已经尝试了您的SQL语句,但它只显示了一个日期相关的第一个日志。是的,我只是将tablename更改为dbo_CHECKINOUI,我用您的示例数据(以及其他几天的附加数据)尝试了这段代码,它返回了您期望的结果。如果您的数据与您在问题中描述的不一样:每个用户每个日期4行,那么我无法判断。谢谢,它现在正在工作。但是如果有人不吃午饭,这样他/她第一个就不会进来,第二个就不会出去了?对不起!因为没有你反应那么快。我是StackOverflow的新用户。
userid  date        Log_In                  LB_Out                  LB_In                   Log_Out                 WorkTime  LunchBreak
5001    12/9/2011   12/9/2011 9:05:34 am    12/9/2011 1:05:53 pm    12/9/2011 2:05:22 pm    12/9/2011 6:05:09 pm    08:00:06  00:59:29
5002    12/9/2011   12/9/2011 9:33:13 am    12/9/2011 1:22:24 pm    12/9/2011 2:33:53 pm    12/9/2011 5:44:34 pm    06:59:52  01:11:29