2017-06-15 3 views
2

Ich versuche die Login-Zeit des Benutzers in Stunden und Minuten für den aktuellen Tag zu berechnen.Aktueller Tag Gesamt-Login-Zeit mysql

ich meine Session-Tabelle habe als

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 

ich eine Abfrage will den gesamten Login-Tag des aktuellen Tages let berechnen kann sagen, das Datum 13 heute. Eine weitere Sache, die ich erwähnen möchte, ist, dass in Record ID 1 angegeben, dass Benutzer am 12-06-2017 eingeloggt hat, aber da ich die Aufnahmezeit von 13 brauche, wird es ab dem 2017-06-13 00:00:00 (als Login-Zeit dieses Tages).

Vielen Dank im Voraus. EDIT:

Bis jetzt Abfrage ich versuchte, die falsche Berechnung für die ID 1 und 5 gibt. für id 1 ist das Protokoll von gestern Berechnung auch und für 5. es wird geben null als Benutzer gerade in

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 - Wir helfen Ihnen, nicht um Code für Sie zu schreiben. Zeigen Sie uns, was Sie bisher versucht haben und ich bin mir ziemlich sicher, dass Ihnen jemand helfen wird, aber niemand wird Ihnen eine fertige Lösung anbieten. – Twinfriends

+0

Okay @Twinfriends. Aktualisieren der Frage mit Abfragen – Googler

+1

ein Push in die richtige Richtung: Blick auf TIMESTAMPDIFF von MySQL – Teun

Antwort

0

Für aktive Sitzungen angemeldet ist Sie CURRENT_TIMESTAMP statt logouttime Wert verwenden könnte. Erstellen Sie Ansicht mit korrigierten Zeitstempel Duplikat derselben Auswahlunterabfrage in Ihrer Abfrage zu vermeiden:

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

Sitzungen aufgeteilt, die auf eine andere Verwendung UNION Syntax mit Bedingungen von einem Tag passiert. Verwenden Sie TIMESTAMPDIFF Funktion, um den Unterschied zwischen logintime und logouttime Werte zu erhalten. Um aggregierte Dauer zu erhalten, die Zeit-Datentyp ist, verwenden Sie SUM Aggregatfunktion und SEC_TO_TIME auf Sekunden zu DATETIME Wert umwandeln:

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

Wenn Sie Daten erhalten für bestimmte Datum wollen, dann nur, fügen Sie folgende WHERE-Klausel der Abfrage:

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

FROM sessions_view WHERE DATUM (logintime) = '2017-06-30') splited_sessions GROUP BY Benutzer-ID, 'Tag' @Alexander es gibt nicht Ich Daten des Datums, die ich zur Verfügung gestellt habe. – Googler

+0

@Googler, dieser Ausdruck gehört zur main (externen) Abfrage, daher muss er direkt an die 'GROUP BY'-Klausel angehängt werden (nach' splited_sessions'). – Alexander

+0

Danke, es gibt ein Problem mit dieser Abfrage. Sagen wir heute ist 2017-07-03 und Benutzer hat sich am 2017-07-02 eingeloggt (wo er sich den ganzen Tag nicht ausgeloggt hat). In diesem Fall, wenn ich die Aufzeichnungen für. 2017-07-03 es retruning keine Sache. Wo sollte es die Zeit vom 2017-07-03 00:00:00 bis zur aktuellen Uhrzeit anzeigen, wie sich der Benutzer gestern angemeldet hat. Wie behebe ich das? – Googler