2016-01-22 7 views
7

में दिनांक के आधार पर समूह एक ही स्तंभ का चयन मुझे लगता है कि इस तरह दिखता है लॉगिन के एक मेज है:अलग कॉलम

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 

यहाँ:

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 

मैं एक परिणाम सेट है कि इस तरह दिखता है का चयन करना मैंने जो कोशिश की है:

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

'कन्वर्ट द्वारा समूह' (VARCHAR (10), li.Created, 10) 'कोशिश करें। – jpw

+1

आप कैसे जानते होंगे कि 04:12:22 AM किसी कारण से _after_ 08:00:00 पूर्वाह्न उसी दिन आता है ...? नियम क्या है जो कहता है कि कौन सा समय चुनना है? –

+0

@ जोचिम इक्सक्सन यह एक टाइपो था, मैंने इसे – Smith

उत्तर

1

राहुल के जवाब के समान, लेकिन आप पहले लॉगिन/अंतिम लॉगआउट प्राप्त करने के लिए स्वयं से जुड़ सकते हैं और परिणाम प्राप्त करने के लिए तिथि से समूह कर सकते हैं;

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 सर्वर 2005 के लिए अनचाहे, आपको वर्चर्स के लिए लंबाई निर्धारित करने की आवश्यकता हो सकती है;

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 सर्वर 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

@ जोचिम इस्कसन यह एक टाइपो था, मैंने इसे – Smith

+0

@ राहुल त्रिपाठी को सही किया है, मुझे सभी परिणामों के लिए एक ही लॉगआउट समय मिल रहा है – 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 2am का लॉगआउट होना अजीब नहीं होगा। ;)

+0

मुझे सभी परिणामों के लिए एक ही लॉगआउट समय भी मिल रहा है – Smith

+0

मैंने 'जॉइन' शर्त आधारित है तारीख को भी, जो मुझे लगता है कि उस मुद्दे को सही करना चाहिए। अभी इसका परीक्षण करने का कोई समय नहीं है, लेकिन उम्मीद है कि यह चाल है। –

संबंधित मुद्दे