2016-01-22 16 views
7

Tôi có một bảng thông tin đăng nhập mà trông như thế này:chọn cùng một nhóm cột theo ngày thành cột khác nhau

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 

tôi cần phải chọn một tập hợp kết quả trông như thế này:

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 

đây là những gì tôi đã thử:

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 

Nhưng kết quả không được nhóm theo ngày.

Cách thích hợp là gì?

+2

Hãy thử 'nhóm bằng CONVERT (VARCHAR (10), li.Created, 10)' thay thế. – jpw

+1

Làm thế nào bạn biết rằng 04:12:22 SA vì một lý do nào đó đến sau 8:00:00 sáng cùng ngày ...? Quy tắc nói thời gian nào cần chọn? –

+0

@JoachimIsaksson Đó là một lỗi đánh máy, tôi đã chỉnh sửa nó – Smith

Trả lời

1

Tương tự như câu trả lời của Rahul, nhưng bạn có thể tự tham gia để đăng nhập lần đầu/đăng xuất lần cuối và chỉ nhóm theo ngày để nhận kết quả bạn đang yêu cầu;

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.

EDIT: chưa được kiểm tra cho SQL Server 2005, bạn có thể cần phải đặt độ dài cho 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

Chuyển đổi này không hoạt động trong máy chủ sql 2005 – Smith

+0

@Smith Bạn đã gắn thẻ với SQL Server 2008 vì vậy tôi đã thử nghiệm với điều đó. Có lẽ bạn nên gắn thẻ lại câu hỏi nếu bạn cần SQL Server 2005. –

+0

Bây giờ tôi muốn tham gia các tên nhân viên từ bảng nhân viên, tôi có cần phải đặt một câu hỏi khác hoặc thêm nó vào câu hỏi này không? – Smith

3

Bạn có thể thử như thế này:

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) 

tức, bạn cần phải nhóm bởi hồ sơ của bạn vào ngày mà thôi và không theo ngày và thời gian cả hai.

+0

Tôi nghĩ rằng sẽ nhận được đăng nhập 04:12:22 AM đăng xuất 10: 05.10AM ...? –

+0

@JoachimIsaksson Đó là lỗi đánh máy, tôi đã chỉnh sửa nó – Smith

+0

@Rahul Tripathi tôi nhận được cùng một thời gian đăng xuất cho tất cả các kết quả – Smith

2

Tôi sẽ giả định rằng đăng xuất 4am vào ngày 20 trong kết quả của bạn là sự giám sát, nếu không chúng tôi cần biết logic xác định rằng nó được coi là thời gian đăng xuất cho ngày đó.

Một vấn đề là bạn đang cố gắng chỉ hiển thị ngày tháng với tư cách là nhóm của bạn, nhưng bạn đang nhóm theo ngày giờ.

Hãy thử này để thay thế:

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) 

Một điều cần xem xét là có hay không đăng nhập trong thời gian có thể chiều dài ranh giới ngày. Nếu điều này là trong ngành công nghiệp công nghệ cao sau đó nó sẽ không được kỳ lạ để có một đăng nhập của 1/20 10pm và đăng xuất 1/21 2am. ;)

+0

Tôi cũng nhận được cùng một thời gian đăng xuất cho tất cả các kết quả – Smith

+0

Tôi đã thêm điều kiện 'JOIN' vào ngày cũng như, mà tôi nghĩ rằng nên sửa vấn đề đó. Không có thời gian để kiểm tra nó ngay bây giờ, nhưng hy vọng rằng không phải là lừa. –

Các vấn đề liên quan