2015-10-29 81 views
0

我有以下表格爲員工考勤系統產生Attendace系統組報告由用戶標識,狀態

userid CheckTime    CheckType 
1  2015-07-31 14:29:18.000  I 
1  2015-07-31 18:29:18.000  O 
1  2015-08-01 08:12:45.000  I 
1  2015-08-02 03:19:03.000  O 
1  2015-08-02 08:15:23.000  I 
1  2015-08-02 14:05:52.000  O 
1  2015-08-02 19:48:57.000  I 
1  2015-08-02 21:48:57.000  O 

怎樣才能得到結果如下

userid checkinTime    CheckOuttime 

1   2015-07-31 14:29:18.000 2015-07-31 18:29:18.000 
. 
. 
1   2015-08-01 08:12:45.000 2015-08-02 03:19:03.000 
+0

你使用了哪個數據庫?簽入/結帳總是配對? – jpw

+0

對於給定的日期/用戶ID,是否只有1個簽入和1個簽出?會不會有登記入住但沒有結賬的情況,反之亦然? – Adish

+0

SQl服務器2008.多個簽入和簽出日期相同的用戶。也許沒有結帳簽入。 –

回答

0

你很可能會尋找類似這樣的:

Select UserId, Min(CheckTime) As CheckInTime, Max(CheckTime) As CheckOutTime 
From EmployeeAttendance 
Group By UserId, Cast(CheckTime As Date); 

更新2015年11月2日

對於你提到的特殊情況,下面是一個更強大的查詢......

Select UserId, InTime.CheckTime As CheckInTime, Min(OutTime.CheckTime) As CheckOutTime 
From 
    (Select UserId, CheckTime From EmployeeAttendance Where CheckType = 'I') As InTime 
    Left Join 
    (Select UserId, CheckTime From EmployeeAttendance Where CheckType = 'O') As OutTime 
    On InTime.UserId = OutTime.UserId 
    And InTime.CheckTime < OutTime.CheckTime 
Group By UserId, InTime.CheckTime; 

這個查詢會選擇每個登錄時間後發生的第一退房時間。

當有兩個連續的登記時,您可以通過提供CheckOutTimenull來進一步探索此查詢。這實際上取決於你將如何使用這些數據以及你對數據的信任程度。

+0

感謝您的解決方案,但我有一個特殊情況,當用戶在15/1/2015 23:00:00辦理登機手續並結帳16/1/2015 06:00:00。謝謝。 –

+0

非常感謝您的幫助,我會測試結果並回饋給您。 –

+0

親愛的@Mike,是否可以按日期顯示身份證,簽到,結帳小組.................. 1/1/2015 ............ .1/2/2015 ......... 1/3/2015 ....... 1/4/2015 .id xxxxxx xxxxxxxx xxxxxxx xxxxxxx checkintime xxxxxx xxxxxxxx xxxxxxx xxxxxxxx checkoutime xxxxxx xxxxxxxx xxxxxxx xxxxxxxx .. .....非常感謝你。 –