2010-02-10 5 views

Répondre

2
SELECT AVG(period) 
FROM (
     SELECT TIME_TO_SEC(TIMEDIFF(@date_posted, date_posted)) AS period, 
       @date_posted := date_posted 
     FROM (
       SELECT @date_posted := NULL 
       ) vars, 
       messages 
     ORDER BY 
       date_posted 
     ) q 
+0

hey ça marche! mais il donne une valeur comme "16775640.3" quelle unité est-ce? comment puis-je convertir en jours ou en heures? – Obay

+0

@Obay: désolé, il y avait un petit pépin, j'ai mis à jour la requête. Ce sera en quelques secondes. – Quassnoi

+0

wow merci l'homme! – Obay

1

Essayez ceci:

SELECT AVG(DATEDIFF(s, M2.Date_Posted, M1.Date_Posted)) as AverageSeconds 
    FROM Messages M1 INNER JOIN Messages M2 ON M1.Id = M2.Id+1 

Désolé, c'est la solution MS-SQL non mySQL - excuses ne viens juste de réaliser que est ce que vous étiez après. Cela peut être utile à quelqu'un d'autre. En réponse aux commentaires ci-dessous - dans SQL Server 2005 ou 2008 - ce qui suit serait une meilleure solution car il ne fait aucune hypothèse sur les clés primaires entières séquentielles ou réelles car il utilise Row_Number pour générer une clé séquentielle unique:

SELECT AVG(DATEDIFF(s, M2.Date_Posted, M1.Date_Posted)) as AverageSeconds 
    FROM (SELECT ROW_NUMBER() OVER(ORDER BY Date_Posted ASC) as Id, Date_Posted FROM 
      Messages) M1 
    INNER JOIN (SELECT ROW_NUMBER() OVER(ORDER BY Date_Posted ASC) as Id, Date_Posted 
      FROM Messages) M2 ON M1.Id = M2.Id+1 
+1

Le code ci-dessus suppose que les ID sont strictement séquentiels, ce qui n'est pas toujours le cas. De plus, qui a dit que les Ids étaient des INT et non des GUID ou des VARCHAR, par exemple? –