6
votes

Comptez le nombre de lignes «chevauchement» dans SQL Server

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.

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.

Merci d'avance.


0 commentaires

3 Réponses :


2
votes

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)


0 commentaires

1
votes

Je pense que cela fonctionnera. XXX


2 commentaires

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.



1
votes

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


0 commentaires