Cela fonctionne sur MS SQL (TSQL), avec fonction ROW_NUMBER():
SELECT l1.UserID, l1.UserName, l1.LogTime AS BeginTime, l2.LogTime AS EndTime,
l1.LogDate, ROW_NUMBER() OVER (ORDER BY l1.LogDate, l1.LogTime) AS 'RowNumber'
FROM log l1
LEFT JOIN log l2
ON l2.UserID = l1.UserID
AND l2.LogTime > l1.LogTime
AND l2.LogDate = l1.LogDate
LEFT JOIN log l3
ON l3.UserID = l1.UserID
AND l3.LogTime < l2.LogTime AND l3.LogTime > l1.LogTime
AND l3.LogDate = l1.LogDate
WHERE l3.UserID IS NULL AND RowNumber % 2 = 1 AND l1.UserID = 1
ORDER BY l1.LogDate, l1.LogTime
Première jointure, joint la première fois avec toutes les fois suivantes pour le même utilisateur et la même date. La deuxième jointure nous permet d'exclure tous les temps à la même date et l'utilisateur qui a un temps entre eux, nous donnant ainsi des temps séquentiels. La fonction ROW_NUMBER nous permet de saisir uniquement toutes les autres lignes, donc nous obtenons 9:00 - 10:00
, mais pas 10:00 - 11:00
.
S'il n'y a pas d'heure de fin, vous obtiendrez NULL pour EndTime.
Notez que pour les périodes s'étendant d'un jour à l'autre, vous devrez ajuster la requête pour combiner l'heure et la date et les comparer ensemble.
Vous ne devriez pas essayer de retourner les résultats pour plus d'un utilisateur, sinon, vous perdrez des données en raison de la fonction mod.
SQL Server? MySQL? Quels types de champs sont LogTime et LogDate? – MartW
Lorsque vous avez une bonne réponse, vous devez accepter la réponse et donner crédit à la personne ..... –