2010-02-10 2 views

ответ

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

эй это работает! но это дает такое значение, как «16775640.3», что это за единица? как я могу конвертироваться в дни или часы? – Obay

+0

@Obay: извините, был небольшой сбой, я обновил запрос. Это будет в секундах. – Quassnoi

+0

wow thanks man! – Obay

1

Попробуйте это:

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 

К сожалению, это MS-SQL решение не MySql - Извинения только понял, что это то, что вы были после. Это может быть полезно кому-то другому.

В ответ на комментарий ниже - в SQL Server 2005 или 2008 - следующее решение будет лучшим решением, поскольку оно не делает предположений о последовательных или целых первичных ключах, поскольку использует Row_Number для генерации уникального последовательного ключа:

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

Приведенный выше код предполагает, что идентификаторы строго последовательны, что не всегда так. Более того, кто сказал, что идентификаторы были INT, а не GUID или VARCHAR, например? –

Смежные вопросы