Microsoft访问中的考勤查询



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

该表如下所示:

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

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

第二个问题与最后一个问题不同。

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

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

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

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

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 等签到),则返回 1,如果不是,则返回 0。

如果计数可被 2 整除,则它必须是签入,如果不是,则为签出。

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

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

相关内容

  • 没有找到相关文章

最新更新