簡體   English   中英

Microsoft Access中的考勤查詢

[英]Time Attendances query in Microsoft Access

我在Microsoft Access中編寫查詢時遇到麻煩。 這是我的表的外觀以及我要從中檢索數據的位置:

在此處輸入圖片說明

我想編寫一個查詢,結果如下:

在此處輸入圖片說明

如您在第一張表中所見,員工每天可以簽入和簽出兩次以上。 員工首次簽到時,日期/時間應放在第一欄“簽到”中。 當他第二次簽到時,日期/時間應放在第二列“簽出”中。 當他第三次簽到時,日期/時間應放在“簽到”列中,依此類推。

從上一個問題中我了解到,對於類似的情況,我可以使用子查詢和模運算符。 但是我不知道如何使查詢對上述問題有效。

讓我們從上一個問題的答案開始,然后從那里開始。

此查詢定義它是簽入還是簽出。 我們稱之為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

然后,我們可以從該查詢獲取簽入,並使用子查詢獲取簽出。

我們使用條件來確保簽出是在同一天,而不是在簽入之后,並使用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'

請注意,在第二個查詢的子查詢中,您無需檢查它是否是入住還是退房,因為比同一天的入住時間短的最短時間始終是退房。

如果要在單個查詢中執行此操作,則可以使用以下查詢。 但是,調試起來將非常困難

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM