Microsoft Access 中的考勤查询
Time Attendances query in Microsoft Access
我在 Microsoft Access 中编写查询时遇到问题。
这是我的 table 的样子以及我想从中检索数据的位置:
我想编写一个具有以下结果的查询:
正如您在第一个 table 中看到的那样,员工每天可以签入和签出 2 次以上。当员工第一次签到时,Date/time 应该放在第一列 "CheckIn"。当他第二次签到时,Date/time 应该放在第二列 "CheckOut"。当他第 3 次签到时,Date/time 应该放在 "CheckIn" 列中,依此类推。
我从我之前的问题中了解到,我可以使用子查询和模数运算符来处理类似的情况。但我无法弄清楚如何使查询适用于上述问题。
让我们从上一个问题的答案开始,然后从那里开始。
此查询定义是签到还是 check-out。我们称它为 qryCheckInOut
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
然后,我们可以从该查询中获取 check-ins,并使用子查询获取 check-out。
我们使用条件来确保退房是在同一天,晚于入住,并使用 Min
聚合来确保它是下一次(可能的最短时间)。
SELECT q.EmployeeID,
q.TimeInOut As TimeIn,
(SELECT Min(s.TimeInOut)
FROM qryCheckInOut s
WHERE s.EmployeeID = q.EmployeeId
AND s.TimeInOut > q.TimeInOut
AND s.TimeInOut <= Int(q.TimeInOut) + 1) As TimeOut
FROM qryCheckInOut q
WHERE q.OriginType = 'I'
注意,在第二个查询的子查询中,不需要检查是check in还是check out,因为当天比check in高的最低时间总是check out .
如果您想在单个查询中完成,您可以使用下面的查询。但是,调试起来会更加困难
SELECT m.EmployeeID,
m.TimeInOut As TimeIn,
(SELECT Min(s.TimeInOut)
FROM MyTable s
WHERE s.EmployeeID = m.EmployeeId
AND s.TimeInOut > m.TimeInOut
AND s.TimeInOut <= Int(m.TimeInOut) + 1) As TimeOut
FROM MyTable m
WHERE
(SELECT COUNT(*)
FROM MyTable s
WHERE s.EmployeeID = m.EmployeeID
AND s.timeInOut <= m.timeInOut
AND s.timeInOut >= INT(m.timeInOut)) Mod 2 = 1
我在 Microsoft Access 中编写查询时遇到问题。 这是我的 table 的样子以及我想从中检索数据的位置:
我想编写一个具有以下结果的查询:
正如您在第一个 table 中看到的那样,员工每天可以签入和签出 2 次以上。当员工第一次签到时,Date/time 应该放在第一列 "CheckIn"。当他第二次签到时,Date/time 应该放在第二列 "CheckOut"。当他第 3 次签到时,Date/time 应该放在 "CheckIn" 列中,依此类推。
我从我之前的问题中了解到,我可以使用子查询和模数运算符来处理类似的情况。但我无法弄清楚如何使查询适用于上述问题。
让我们从上一个问题的答案开始,然后从那里开始。
此查询定义是签到还是 check-out。我们称它为 qryCheckInOut
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
然后,我们可以从该查询中获取 check-ins,并使用子查询获取 check-out。
我们使用条件来确保退房是在同一天,晚于入住,并使用 Min
聚合来确保它是下一次(可能的最短时间)。
SELECT q.EmployeeID,
q.TimeInOut As TimeIn,
(SELECT Min(s.TimeInOut)
FROM qryCheckInOut s
WHERE s.EmployeeID = q.EmployeeId
AND s.TimeInOut > q.TimeInOut
AND s.TimeInOut <= Int(q.TimeInOut) + 1) As TimeOut
FROM qryCheckInOut q
WHERE q.OriginType = 'I'
注意,在第二个查询的子查询中,不需要检查是check in还是check out,因为当天比check in高的最低时间总是check out .
如果您想在单个查询中完成,您可以使用下面的查询。但是,调试起来会更加困难
SELECT m.EmployeeID,
m.TimeInOut As TimeIn,
(SELECT Min(s.TimeInOut)
FROM MyTable s
WHERE s.EmployeeID = m.EmployeeId
AND s.TimeInOut > m.TimeInOut
AND s.TimeInOut <= Int(m.TimeInOut) + 1) As TimeOut
FROM MyTable m
WHERE
(SELECT COUNT(*)
FROM MyTable s
WHERE s.EmployeeID = m.EmployeeID
AND s.timeInOut <= m.timeInOut
AND s.timeInOut >= INT(m.timeInOut)) Mod 2 = 1