On m'a demandé de consulter une base de données qui enregistre l'activité de connexion et de déconnexion utilisateur - il y a une colonne pour l'heure de connexion, puis une autre colonne pour enregistrer la déconnexion, à la fois au format OLE. Je dois regrouper des informations sur la simultanéité utilisateur - c'est-à-dire combien d'utilisateurs ont été connectés en même temps chaque jour. p>
Est-ce que quelqu'un sait-il comment faire cela dans SQL? Je n'ai pas vraiment besoin de connaître le détail, juste le compte par jour. P>
Merci d'avance. P>
3 Réponses :
Le moyen le plus simple consiste à faire une TIME_TABLE à partir d'une table des nombres auxiliaires (en ajoutant de 0 à 24 * 60 minutes à la durée de la base) pour obtenir à chaque fois dans une certaine période de 24 heures:
SELECT MAX(simul) FROM (
SELECT test_time
,COUNT(*) AS simul
FROM your_login_table
INNER JOIN times_table -- a table/view/subquery of all times during the day
ON your_login_table.login_time <= times_table.test_time AND times_table.test_time <= your_login_table.logout_time
GROUP BY test_time
) AS simul_users (test_time, simul)
Je pense que cela fonctionnera.
Merci - je devais le modifier légèrement (en ajoutant un groupe à la fin de la sélection intérieure), mais il semble avoir fait le travail.
Désolé pour ça, écrivit ça au sommet de ma tête et je ne l'ai pas choisi de près. J'ai ajouté le groupe en répondant.
non coché ... mais perdez les valeurs de date, le temps comptent entre, utilisez "fin de journée" pour toujours connecté.
Ceci assume "LoginTime" est une date et une heure. Sinon, la table dérivée peut être retirée (nécessite toujours Isnull). Bien sûr, SQL Server 2008 a le "temps" pour rendre cela plus facile aussi. P>
SELECT
COUNT(*)
FROM
(
SELECT
DATEADD(day, DATEDIFF(day, logintime, 0), logintime) AS inTimeOnly,
ISNULL(DATEADD(day, DATEDIFF(day, logouttime, 0), logintime), '1900-01-01 23:59:59.997') AS outTimeOnly
FROM
mytable
) foo
WHERE
inTimeOnly >= @TheTimeOnly AND outTimeOnly <= @TheTimeOnly