Microsoft Access

时间:2018-03-10 16:53:09

标签: sql datetime ms-access time-and-attendance

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

表格如下:

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

正如您在表中所见,员工每天可以登记和退房超过2次。我的问题是:如何在OriginType列中确定哪一行是IN还是Out?当员工第一次办理登记时,OriginType应为"我"。当他第二次登记时,OriginType应为" O"。当他第三次登记时,OriginType应该是"我"再一次等等。

第二个问题与上一个问题不同。

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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(例如,第1,第3,第5等登记),如果不是,则返回0。

如果计数可以被2整除,那么它必须是一个登记入住,如果不是,那就是结账。