2017-06-15 48 views
2

我正在計算用戶的登錄時間,以小時和分鐘爲當天。當天總登錄時間mysql

我有我的會話表作爲

id| user_id | logintime   |logouttime   | isactive 
1| 100  | 2017-06-12 22:53:53 |2017-06-13 02:53:53 | 0 
2| 100  | 2017-06-13 08:53:53 |2017-06-13 09:13:53 | 0 
3| 100  | 2017-06-13 10:53:53 |2017-06-13 11:33:53 | 0 
4| 100  | 2017-06-13 11:53:53 |2017-06-13 12:13:53 | 0 
5| 100  | 2017-06-13 12:53:53 |NULL (As user is currently logged in)| 1 

我想查詢它可以計算出當天就讓總登錄日說,日期爲當天13。還有一件事我想提到的是,在記錄ID 1它說明用戶確實登錄在12-06-2017,但因爲我需要記錄時間13,所以它將從2017-06-13 00:00:00開始(作爲當天登錄時間)。

在此先感謝。 編輯:

到目前爲止查詢我試過,這是給錯誤的計算爲id 1和5。 爲ID 1是計算昨日也紀要和第五它給null作爲用戶在

SELECT TIMESTAMPDIFF(minute,logintime,logouttime) FROM `table` WHERE user_id= 17 and DATE(logouttime) = DATE(UTC_TIMESTAMP) 
+2

http://stackoverflow.com/help/how-to-ask - 我們在這裏幫忙,而不是爲你寫代碼。向我們展示您目前爲止所嘗試的內容,我確定有人會幫助您,但沒有人會爲您提供完整的解決方案。 – Twinfriends

+0

好的@Twinfriends。用查詢更新問題 – Googler

+1

向正確方向推進:查看來自mysql的TIMESTAMPDIFF – Teun

回答

0

當前登錄因爲你可以使用CURRENT_TIMESTAMP代替logouttime價值活動會話。創建視圖與修正時間戳,以避免在查詢中重複同樣的選擇子查詢:

CREATE VIEW sessions_view AS 
SELECT 
    user_id, 
    logintime, 
    IF(isactive, CURRENT_TIMESTAMP, logouttime) AS logouttime 
FROM sessions_table; 

要拆分從一開始就通過與條件另一個使用UNION語法會話。使用TIMESTAMPDIFF函數獲取logintimelogouttime值之間的差異。爲了獲得累計持續時間也就是時間數據類型,使用SUM聚合函數和SEC_TO_TIME到秒轉換爲DATETIME值:

SELECT 
    user_id, 
    DATE(logintime) AS `day`, 
    SEC_TO_TIME(SUM(TIMESTAMPDIFF(SECOND, logintime, logouttime))) 
FROM 
    (SELECT 
     user_id, 
     logintime, 
     IF(DATE(logouttime)>DATE(logintime), TIMESTAMP(DATE(logouttime)), logouttime) AS logouttime 
    FROM sessions_view 
    UNION ALL 
    SELECT 
     user_id, 
     TIMESTAMP(DATE(logouttime)) AS logintime, 
     logouttime 
    FROM sessions_view 
    WHERE DATE(logouttime)>DATE(logintime)) splited_sessions 
GROUP BY user_id, `day`; 

如果你想獲得特定日期的數據而已,然後附加以下WHERE子句查詢:

WHERE DATE(logintime) = '2017-06-13' 
+0

FROM sessions_view WHERE DATE(logintime)='2017-06-30')splited_sessions GROUP BY user_id,''' @Alexander它沒有給出我提供的日期數據。 – Googler

+0

@Googler,這個表達式屬於主(外部)查詢,因此它必須直接附加在'GROUP BY'子句之前('splited_sessions'之後)。 – Alexander

+0

Thanks dude,這個查詢有一個問題。假設今天是2017-07-03並且用戶已經登錄在2017-07-02(他沒有在全天註銷)。在這種情況下,如果我得到的記錄。 2017-07-03這不是什麼回味。應該在昨天用戶登錄時顯示從2017-07-03 00:00:00到當前時間的時間。如何解決這個問題? – Googler