2017-06-15 11 views
2

私は現在の日の時間と分でユーザーのログイン時間を計算しようとしています。現在の日の合計ログイン時間mysql

私は現在の日の総ログイン日を計算することができ、クエリは、日付が13今日で言わせたい

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 

ように私は私のセッションテーブルを持っています。私が言及したいもう一つの事は、Record id 1にはユーザーが12-06-2017にログインしたと書かれていますが、私は13という記録時間が必要なので、2017-06-13 00:00:00からその日のログイン時間)。

ありがとうございます。 EDIT:

これまでのところ、id 1と5の計算が間違っていました。 ID 1のために、それはまた、昨日の分を計算して、第五のためには、現在あなたがCURRENT_TIMESTAMP代わりのlogouttime値を使用することができ、アクティブなセッションのために

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

にログインしているユーザーとしてnullを与えています。条件に別の使用UNION構文に1日から渡されたセッションを分割するには

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

:あなたのクエリで重複した同じ選択サブクエリを回避するために、修正タイムスタンプを持つビューを作成します。 TIMESTAMPDIFF関数を使用して、logintimeとの値の差を取得します。あなたが特定の日付のデータを取得したい場合のみ、クエリへWHERE句以下の追加

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`; 

DATETIME値に秒に変換するためにSUM集約関数とSEC_TO_TIMEを使用し、時刻データ型をで集約された時間を取得するには:

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

FROM sessions_view WHERE DATE(logintime)= '2017-06-30')splitched_sessions GROUP BY user_id、 'day' @Alexanderそれは与えていません私が提供した日付の私のデータ。 – Googler

+0

@Googlerでは、この式はメイン(外部)クエリに属しているため、 'GROUP BY'節の直前に(' splited_sessions'の後に)追加する必要があります。 – Alexander

+0

ありがとう、このクエリには1つの問題があります。今日は2017-07-03で、ユーザは2017-07-02にログオンしているとします(彼は一日中ログアウトしませんでした)。この場合、私はレコードを取得します。 2017-07-03これは何も再実行されていません。ユーザが昨日ログインしたときの時刻を2017-07-03 00:00:00から現在の時刻に表示する場所。これを修正するには? – Googler

関連する問題