2016-01-22 109 views
7

我登錄的表看起來像這樣:按日期選擇相同組的列到不同的列

Created    | Action 
20/01/2016 08:00:00 AM login 
20/01/2016 10:05:10 AM logout 
20/01/2016 12:00:00 PM login 
20/01/2016 04:12:22 PM logout 
21/01/2016 08:00:50 AM login 
21/01/2016 09:44:42 AM login 
21/01/2016 10:44:42 AM login 
21/01/2016 04:00:42 PM logout 

我需要選擇一個結果集,看起來像這樣:

Created  | Login | Logout   
20/01/2016  08:00:00 AM 04:12:22 PM 
21/01/2016  08:00:50 PM 04:00:42 PM 

這裏是我曾嘗試過的:

SELECT 
    CONVERT(VARCHAR(10),li.Created,10) [Date], 
    CONVERT(VARCHAR(8),MAX(li.Created),8) [Login], 
    CONVERT(VARCHAR(8),MAX(lo.Created),8) [Logout] 
FROM Logins li 
LEFT JOIN Logins lo ON lo.[Action] = 'logout' 
GROUP BY li.Created 

但是結果沒有按日期分組。

什麼是正確的方法?

+2

嘗試'由CONVERT(VARCHAR(10),li.Created,10)'組代替。 – jpw

+1

你怎麼知道04:12:22 AM由於某種原因在同一天08:00:00 AM?什麼規定哪個時間選擇? –

+0

@JoachimIsaksson這是一個錯字,我糾正了它 – Smith

回答

1

與Rahul的回答類似,但您可以自行加入以獲取第一次登錄/最後一次登出,並按日期分組以獲得您要求的結果;

SELECT CONVERT(DATE,  li.created) [Date], 
     CONVERT(TIME, MIN(li.created)) [Login], 
     CONVERT(TIME, MAX(lo.created)) [Logout] 
FROM Logins li 
JOIN Logins lo 
    ON CONVERT(DATE, li.created) = CONVERT(DATE, lo.created) 
AND li.action = 'login' 
AND lo.action = 'logout' 
GROUP BY CONVERT(DATE, li.created) 

An SQLfiddle to test with

編輯:未經測試的SQL Server 2005,您可能需要設置varchars的長度;

SELECT CONVERT(VARCHAR, li.created, 110) [Date], 
     CONVERT(VARCHAR, MAX(li.created), 8) [Login], 
     CONVERT(VARCHAR, MAX(lo.created), 8) [Logout] 
FROM Logins li 
JOIN Logins lo 
    ON CONVERT(VARCHAR, li.created, 110) = CONVERT(VARCHAR, lo.created, 110) 
AND li.action = 'login' 
AND lo.action = 'logout' 
GROUP BY CONVERT(VARCHAR, li.created, 110) 

Another SQLfiddle

+0

這個轉換在sql server 2005中不起作用 – Smith

+0

@Smith你用SQL Server 2008標記了所以我測試過了。如果你需要SQL Server 2005,也許你應該重新標記這個問題。 –

+0

現在我想加入員工表中的員工姓名,我是否需要提出另一個問題或將其添加到此問題? – Smith

3

你可以嘗試這樣的:

SELECT 
CONVERT(VARCHAR(10),li.Created,10) [Date], 
CONVERT(VARCHAR(8),MAX(li.Created),8) [Login], 
CONVERT(VARCHAR(8),MAX(lo.Created),8) [Logout] 
From Logins li 
Left Join Logins lo on lo.[Action] = 'logout' 
GROUP BY CAST(li.Created AS DATE) 

即,你需要按您的記錄上的日期,而不是按日期和時間兩者。

+0

我認爲會得到登錄04:12:22 AM註銷10:05.10AM ...? –

+0

@JoachimIsaksson這是一個錯字,我糾正了 – Smith

+0

@Rahul Tripathi我得到的所有結果相同的註銷時間 – Smith

2

我打算假設您的結果20日上午4點註銷是一個疏忽,否則我們需要知道確定它應該被視爲當天註銷時間的邏輯。

一個問題是,您試圖僅顯示日期作爲您的組,但您按照日期和時間進行分組。

試試這個:

SELECT 
    CAST(LI.created AS DATE) AS created, 
    MIN(CAST(LI.created AS TIME)) AS login, 
    MAX(CAST(LO.created AS TIME)) AS logout 
FROM 
    dbo.My_Table LI 
LEFT OUTER JOIN dbo.My_Table LO ON 
    LO.action = 'logout' AND 
    CAST(LO.created AS DATE) = CAST(LI.created AS DATE) 
WHERE 
    LI.action = 'login' 
GROUP BY 
    CAST(LI.created AS DATE) 

另一個要考慮的是,是否登錄時間可以跨越的日期範圍。如果這是科技行業的話,登錄1/20晚上10點和登出1/21凌晨2點並不奇怪。 ;)

+0

我也得到了所有結果相同的註銷時間 – Smith

+0

我添加了一個基於'JOIN'條件的在那個日期,我認爲應該糾正這個問題。現在沒時間去測試它,但希望這樣做。 –

相關問題