2010-04-21 3 views
1

J'ai données suivantesrequête Affichage de l'heure dans SQL

UserID UserName LogTime LogDate 
1  S   9:00 21/5/2010 
1  S   10:00 21/5/2010 
1  S   11:00 21/5/2010 
1  S   12:00 21/5/2010 

Besoin de sortie comme: -

1  s  9:00 10:00 21/5/2010 
1  s  11:00 12:00 21/5/2010 
+1

SQL Server? MySQL? Quels types de champs sont LogTime et LogDate? – MartW

+0

Lorsque vous avez une bonne réponse, vous devez accepter la réponse et donner crédit à la personne ..... –

Répondre

0

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.

+0

monsieur son erreur d'affichage de rownumber et avoir SQL Server 2005 – Nisha

+0

Ce n'est pas la syntaxe correcte pour 'ROW_NUMBER()'. Il doit être 'OVER' quelque chose et ne peut pas être placé dans le prédicat (vous avez besoin d'un CTE pour le filtrer). – Aaronaught