Разница во времени между строками (MySQL)

0

У меня есть таблица вроде этого (другие столбцы удалены):

+---------+----------+---------------------+---------------------+
| id      | party_id | begintime           | endtime             |
+---------+----------+---------------------+---------------------+
| 1528604 |    10000 | 2011-09-22 15:33:52 | 2011-09-23 14:09:34 |
| 1528605 |    10000 | 2011-09-23 14:12:48 | 2011-09-23 14:12:50 |
| 1528606 |    10000 | 2011-09-23 14:14:36 | 2011-09-23 15:29:59 |
| 1528607 |    10000 | 2011-09-23 15:33:50 | 2011-09-26 09:52:19 |
| 1528608 |    10000 | 2011-09-26 09:54:59 | 2011-09-26 11:20:55 |
| 1528609 |    10000 | 2011-09-26 11:23:30 | 2011-09-26 11:39:44 |
| 1528610 |    10000 | 2011-09-26 11:47:19 | 2011-09-26 12:45:00 |
| 1528611 |    10000 | 2011-09-26 12:47:22 | 2011-09-26 14:28:53 |
| 1528612 |    10000 | 2011-09-26 14:31:38 | 2011-09-26 15:26:08 |
| 1528613 |    10000 | 2011-09-26 15:29:37 | 2011-09-26 18:15:00 |
| 1528614 |    10000 | 2011-09-26 18:16:48 | 2011-09-26 19:38:11 |
| 1528615 |    10000 | 2011-09-26 19:40:19 | 2011-09-26 22:23:37 |
+---------+----------+---------------------+---------------------+

Мне нужно рассчитать разницу во времени между endtime и begintime в следующей строке. Ожидаемый результат должен выглядеть следующим образом:

194
106
231
......

т.е. 194 = timestampdiff(second,'2011-09-23 14:09:34','2011-09-23 14:12:48') и так далее.

Я пробовал это:

select timestampdiff(second, t1.begintime, t2.endtime) 
    from doses t1 join doses t2
    on t2.id=(select t2.id from doses t2 where t2.id>t1.id limit 1) 
        and t2.party_id=10000
        and t1.party_id=10000;

но результат имеет слишком много значений. Что я делаю неправильно?

Теги:

2 ответа

1
Лучший ответ

Не уверен, какой именно результат вы хотите достичь, но вы можете попробовать следующее:

select t1.id, t1.'party_id', t1.begintime, t1.endtime, timestampdiff(second,t1.endtime, t2.begintime) 'timediff'
from (
  select test.*, @rowno1 := @rowno1 + 1 rowno
  from test
  cross join (select @rowno1 := 1) t
  order by id
) t1
left join (
  select test.*, @rowno2 := @rowno2 + 1 rowno
  from test
  cross join (select @rowno2 := 0) t
  order by id
) t2 on t1.rowno = t2.rowno

Вот демоверсия SQLFiddle.

  • 0
    Спасибо. Это именно то, что мне нужно.
0

Я сам не пробовал, но думаю, что если мы можем выбрать одну следующую строку, используя зависимый подзапрос, мы можем вычесть его значение.

SELECT 
    timestampdiff(second, t1.begintime, 
       (SELECT t2.endtime 
       FROM doses t2
       WHERE 
          t2.id>t1.id AND
          t2.party_id = t1.party_id
       LIMIT 1)) 
FROM doses t1 
WHERE t1.party_id=10000;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню