Microsoft Access 中的出勤查询

Attendances query in Microsoft Access

这是我第一次在这个论坛上发帖提问。一周以来,我一直在努力在 Microsoft Access 中编写查询,我希望这里有人可以帮助我。我正在使用 vb6 中的指纹构建一个考勤应用程序。

table 看起来像这样:

https://i.stack.imgur.com/MZcwI.png

如您在 table 中所见,一名员工每天可以签入和签出 2 次以上。我的问题是:如何在 OriginType 列中确定哪一行是 IN 或 Out?当员工第一次签到时,OriginType 应该是 "I"。当他第二次签入时,OriginType 应该是 "O"。当他第 3 次签入时,OriginType 应该再次为 "I",依此类推。

第二题与上一题不同。

我想编写一个从 timeInOut 列中进行选择的查询。我希望 table 看起来像这样:

https://i.stack.imgur.com/GgAhx.png

如您所见,现在有 2 个新列,并且不再有 OriginType 列。我仍然想使用相关子查询和取模运算符。当它是签入时,我希望它被放置在列 "CheckIn" 中,如果它是结帐,我希望它被放置在列 "CheckOut" 中。

您可以从以下查询中获取最后一个 OriginType,然后插入 'I' 如果最后一个是 "O",或者查询没有返回任何行并且 "O" 如果最后一个是 "I"。

SELECT OriginType from Employee where employeeId = 1 and timeInOut = (select max(timeInOut) from Employee where employeeId = 1)

您可以为此使用相关子查询和取模运算符:

SELECT EmployeeID, 
    timeInOut, 
    IIF(
        (SELECT COUNT(*) 
        FROM MyTable s 
        WHERE s.EmployeeID = m.EmployeeID 
        AND s.timeInOut <= m.timeInOut
        AND s.timeInOut >= INT(m.timeInOut)) Mod 2 = 1, "I", "O") As OriginType
FROM MyTable m

此查询按以下方式工作:

子查询获取与当前行在同一日期发布的该员工的行数。然后,我们计算该计数的 2 的模数,如果计数不能被 2 整除(例如第 1、3、5 等 check-in)则返回 1,否则返回 0。

如果计数能被2整除,那么一定是签入,否则就是签出。