2012-05-07 5 views
1

J'utilise SQL Server 2008 et à la recherche comment créer une telle requête:requête SQL pour le groupe par jour et calculer le temps écoulé (Agrégation des)

J'ai une table:

Username nvarchar(50), LogDate datetime 

Test1, 2012.01.01 00:00:00 
Test2, 2012.01.01 00:00:02 
Test1, 2012.01.01 00:00:05 
Test3, 2012.01.01 00:00:06 
Test1, 2012.01.02 00:01:01 
Test2, 2012.01.02 00:02:50 
Test1, 2012.01.02 00:01:01 

Chaque quelques secondes les utilisateurs envoient des mises à jour pour insérer la date-heure actuelle avec son nom d'utilisateur dans la table de journal. J'ai besoin de calculer combien d'heures les utilisateurs étaient "en ligne" tous les jours.

Je suppose que la requête doit faire la somme de DateDiff entre deux lignes avec le même nom d'utilisateur groupé par jour.

J'ai essayé d'utiliser le rang, mais je n'ai pas ce que je veux.

Nous vous remercions de votre aide à l'avance.

+2

"Je suppose que la requête devrait additionner DateDiff entre deux rangées avec le même nom d'utilisateur groupé par jour." Probablement pas. Si je me suis connecté pendant quelques minutes juste après minuit, puis connecté à nouveau quelques minutes avant minuit, cet algorithme afficherait presque 24 heures au lieu de 4 ou 5 minutes. –

+0

Il est très mauvais d'insérer une ligne dans la table. Il suffit d'insérer et d'enregistrer l'heure de début quand ils se connectent et mettre à jour l'heure de fin à la période régulière. De cette façon, vous savez combien de temps ils ont passé sur votre site. –

+0

Maintenant, je ne suggère pas que c'est un bon moyen de suivre les utilisateurs, mais j'avais une question similaire à cela il y a un certain temps. J'ai fondamentalement décomposé la journée en minutes et vérifié pour "à l'heure" pendant cette minute. http://stackoverflow.com/questions/761700/how-can-i-check-for-average-concurrent-events-in-a-sql-table-based-on-the-date – scottm

Répondre

1

Vous pouvez extraire la partie date du DateTime et du groupe par le UserName à utiliser DateDiff sur les valeurs MIN/MAX:

Tableau et configuration des données:

create table UserLog (Username nvarchar(50), LogDate DateTime); 

insert into UserLog Values('Test1', '2012-01-01 00:00:00'); 
insert into UserLog Values('Test2', '2012-01-01 00:00:02'); 
insert into UserLog Values('Test1', '2012-01-01 00:00:05'); 
insert into UserLog Values('Test3', '2012-01-01 00:00:06'); 
insert into UserLog Values('Test3', '2012-01-01 00:01:26'); 
insert into UserLog Values('Test3', '2012-01-01 00:03:22'); 
insert into UserLog Values('Test3', '2012-01-01 00:05:42'); 
insert into UserLog Values('Test3', '2012-01-01 00:00:06'); 
insert into UserLog Values('Test1', '2012-01-02 00:01:01'); 
insert into UserLog Values('Test2', '2012-01-02 00:02:50'); 
insert into UserLog Values('Test1', '2012-01-02 00:01:01'); 

Ensuite, vous pouvez sélectionner la manière suivante :

select UserName, CAST(LogDate AS DATE) as BusinessDay, 
MIN(LogDate) as FirstLogEntry, MAX(LogDate) as LastLogEntry, 
DATEDIFF(second,MIN(LogDate), MAX(LogDate)) as ElapsedSeconds 
FROM UserLog 
GROUP BY Username, CAST(LogDate AS DATE) 

Cela donnera les résultats suivants et vous pouvez calculer des heures à partir des secondes. J'ai montré des secondes basées sur vos données d'échantillon avec l'utilisateur de test3 étendu:

UserName BusinessDay FirstLogEntry   LastLogEntry   ElapsedSeconds 
-------- ----------- ----------------------- ----------------------- -------------- 
Test1 2012-01-01 2012-01-01 00:00:00.000 2012-01-01 00:00:05.000 5 
Test2 2012-01-01 2012-01-01 00:00:02.000 2012-01-01 00:00:02.000 0 
Test3 2012-01-01 2012-01-01 00:00:06.000 2012-01-01 00:05:42.000 336 
Test1 2012-01-02 2012-01-02 00:01:01.000 2012-01-02 00:01:01.000 0 
Test2 2012-01-02 2012-01-02 00:02:50.000 2012-01-02 00:02:50.000 0 
+0

merci tou, tawman, mais si l'utilisateur s'est connecté pendant quelques minutes juste après minuit, puis connecté à nouveau pendant quelques minutes juste avant minuit, cet algorithme affiche presque 24 heures au lieu de 4 ou 5 minutes. – norcis

Questions connexes