2017-04-04 68 views
1

感謝您的幫助!這裏的另一個...
SQL - 交換/交換字段值

現狀:

公司從早8點工作 - 下午6:00。
我們使用生物識別設備進行考勤。
員工在按下手指前先點擊設備上的「IN」或「OUT」,以知道它是IN(上午)還是OUT(下午)。

問題:

一些員工錯誤地點擊設備上的 「OUT」,然後按自己的手指,因爲他們簽到,註冊爲OUT(AM)..(反之亦然),IN(PM)。

下面是一個簡單的數據以供參考:

EmpID LogTime     CheckType 
1  4/4/2017 7:24:22 AM  OUT 
1  4/4/2017 18:02:11 PM  IN 

一個員工打「OUT」,但當時被認爲是「IN」清晨。下午離開辦公室時打「IN」。

問:

使用SQL(SQL Server)的,我怎麼能交換他們的checktypes?

非常感謝你們!

+1

如果有人有什麼留下了一個小時,回來?即IN,OUT,IN和OUT同一天? – jarlh

+0

絕對確定他們在中午之前只有IN,而在中午之後纔是OUT? – BeanFrog

+0

@jarlh我有一個代碼來獲得第一個IN,最後一個OUT。它工作得很好,除了我上面發佈的問題:( – Jorz

回答

2
Update attendance set checkType = 'IN' where LogTime between <min range> and <max range> 

給早上的時間範圍類似的情況下結帳。

+0

哇。 。 我從來沒想過這點!我會試一試,並希望接受這個答案。謝謝! – Jorz

+0

沒問題:)同樣,你也可以做結賬。 –

+1

我不確定這在任何情況下都能正常工作。這從來沒有把'OUT'分配給任何東西。例如,這可能會導致員工很晚到達工作崗位,然後很快離職。 –

1

我的策略是爲每對僱員記錄分配一個行號。但是,我們根據日誌時間和檢查類型分配行號排序。如果訂單是正確的,那麼按日期查看給定的員工記錄對,這兩個行號都應該鎖定爲1-2步。但是,如果順序顛倒,那麼我們應該在日誌時間內看到1-2,而檢查類型則應該看到21。

WITH cte AS (
    SELECT EmpID, LogTime, CheckType, 
      ROW_NUMBER() OVER (PARTITION BY EmpID ORDER BY LogTime) rn1, 
      ROW_NUMBER() OVER (PARTITION BY EmpID ORDER BY CheckType) rn2 
    FROM yourTable 
) 
UPDATE cte 
SET CheckType = CASE WHEN CheckType = 'OUT' THEN 'IN' ELSE 'OUT' END 
WHERE rn1 <> rn2 

下表可以說明我的心裏有:

EmpID LogTime     CheckType rn1 rn2 
1  4/4/2017 7:24:22 AM  OUT   1  2 
1  4/4/2017 18:02:11 PM  IN   2  1 

如果員工1已經記錄了他正確的時候,我們會看到這一點:

EmpID LogTime     CheckType rn1 rn2 
1  4/4/2017 7:24:22 AM  OUT   1  1 
1  4/4/2017 18:02:11 PM  IN   2  2 

換句話說,兩個計算出來的行數都是一樣的。

這是我與你的樣本數據中使用的熱膨脹係數的演示

Rextester

+0

Msg 102,Level 15,State 1,Line 9 't'附近語法不正確。 – Jorz

+0

我從更新中刪除了別名。請再試一次。 –

+0

它工作..但錯誤的結果.. AM/PM隨機與IN/OUT – Jorz