Ich habe eine Tabelle, die Aufzeichnungen verschiedener Sitzungen eines Benutzers speichert (Anmelden, Abmelden, Verlassen, Online). Ich kann die Dauer jeder Sitzung mithilfe der unten angegebenen Abfrage berechnen. Es gibt ein Szenario, sagen wir, ein Benutzer startet eine Online-Sitzung am „15. Mai 2022, 23:00:00 Uhr“ und verlässt diese am nächsten Tag am „16. Mai 2022, 14:00 Uhr: 00 Uhr“. Die gesamte Online-Zeit beträgt 3 Stunden und das Datum, das ich für die letzte Zeile erhalte, ist der 15. Mai 2022.
Aber ich brauche das Die Online-Zeit vom 15. Mai bis „23:59:59 Uhr am 15. Mai 2022“ beträgt 1 Stunde und vom 16. Mai bis „00:00:00 Uhr am 16. Mai 2022 bis 02:00 Uhr am 16. Mai 2022“ 00 „:00 Uhr“, online für 2 Stunden. Als Antwort sollte also 1 Stunde vom 15. Mai und 2 Stunden vom 16. Mai zurückgegeben werden, statt insgesamt 3 Stunden für den 15. Mai
Ich verwende die Lead-Funktion, um die Dauer aus der Spalte „created_at“ abzurufen. Gibt es eine Möglichkeit, die Lead-Funktion zu begrenzen, um die Dauer bis zum nächsten „created_at“ bis 23:59:59 zu berechnen?
Das ist meine Stellenanfrage. Ich verwende die neueste MySQL(8)-Version.
select `id`, `user_id`, `status`, `created_at`, SEC_TO_TIME(TIMESTAMPDIFF(SECOND, created_at, LEAD(created_at) OVER (PARTITION BY user_id ORDER BY created_at))) as duration, date(created_at) as date from `user_websocket_events` as `all_status` where created_at between '2022-05-15 00:00:00' and '2022-05-16 23:59:59' and `status` is not null and user_id in (69) order by `id` asc;
Hier sind einige Beispieldaten.
INSERT INTO user_websocket_events (id, user_id, event, status, extra_attributes, created_at, updated_at) VALUES (10816, 69, 'subscribe', 'online', null, '2022-05-15 12:57:31', '2022-05-14 10:57:37'); INSERT INTO user_websocket_events (id, user_id, event, status, extra_attributes, created_at, updated_at) VALUES (10817, 69, 'away', 'away', null, '2022-05-15 20:57:31', '2022-05-14 10:57:37'); INSERT INTO user_websocket_events (id, user_id, event, status, extra_attributes, created_at, updated_at) VALUES (10818, 69, 'online', 'online', null, '2022-05-15 22:57:31', '2022-05-14 10:57:37'); INSERT INTO user_websocket_events (id, user_id, event, status, extra_attributes, created_at, updated_at) VALUES (10819, 69, 'away', 'away', null, '2022-05-16 02:57:31', '2022-05-14 10:57:37'); INSERT INTO user_websocket_events (id, user_id, event, status, extra_attributes, created_at, updated_at) VALUES (10820, 69, 'unsubscribe', 'unsubscribe', null, '2022-05-16 03:57:31', '2022-05-14 10:57:37');
使用动态日历表按天分割会话