2013-03-25 2 views
0

У меня есть 500 киосков в магазинах и таблица, которая отслеживает отметки времени печати по идентификатору магазина. Мне нужно создать набор записей, который дает мне время между отпечатками в секундах. Все эти данные хранятся в одной таблице. Запись вставляется для каждой печати и содержит идентификатор магазина и отметку времени.mySql TimeDiff между TimeStamp в строках одной таблицы

ТАБЛИЦА ИМЯ = печати
ID     store_id     метка времени
                      2013-3-1 00:00:01
                      2013-3-1 00:00:01 *
                      2013-3-1 00:00:01
                      2013-3-1 00:00:12 *
                      2013-3-1 00:00:06
                      2013-3-1 00:00:15 *

мне нужно тянуть время в секундах между ВСЕМ магазином # 2 гравюр. * * Так что вы можете найти записи, которые мне нужно легко сравнить.

RecordSet Результаты ниже:

ID     store_id     myTimeDiffSeconds
                                                           

Это должно быть простым и быстрым. Могу ли я сделать это без временной таблицы?

+0

несколько ответов здесь: http://stackoverflow.com/questions/5402938/mysql-find-difference-between-rows-of-the-same-table – ethrbunny

ответ

1

Вы можете написать запрос двумя способами
1. используя коррелированный запрос
2. с помощью переменной сеанса

Первый именно ethrbunny указал

mysql> SELECT t1.id, 
      t1.store_id, 
      timestampdiff(second,IFNULL((SELECT MAX(t2.timestamp) 
              FROM print t2 
             WHERE t2.store_id=2 
               AND t2.timestamp< t1.timestamp) 
         ,t1.timestamp),t1.timestamp) myTimeDiffSeconds 
    FROM print t1 
    WHERE t1.store_id=2 ORDER BY t1.timestamp; 
+------+----------+-------------------+ 
| id | store_id | myTimeDiffSeconds | 
+------+----------+-------------------+ 
| 2 |  2 |     0 | 
| 4 |  2 |    11 | 
| 6 |  2 |     3 | 
+------+----------+-------------------+ 
3 rows in set (0.00 sec) 

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

mysql> select min(p.timestamp) into @prev_time from print p where p.store_id=2; 
Query OK, 1 row affected (0.00 sec) 

mysql> select id, 
      store_id, 
      timestampdiff(second,@prev_time,timestamp) myTimeDiffSeconds, 
      @prev_time:=timestamp 
    from print 
    where store_id=2 order by timestamp; 
+------+----------+-------------------+---------------------+ 
| id | store_id | myTimeDiffSeconds | @prev_time:=t  | 
+------+----------+-------------------+---------------------+ 
| 2 |  2 |     0 | 2013-03-01 00:00:01 | 
| 4 |  2 |    11 | 2013-03-01 00:00:12 | 
| 6 |  2 |     3 | 2013-03-01 00:00:15 | 
+------+----------+-------------------+---------------------+ 
3 rows in set (0.00 sec) 

индекс (timestamp, store_id) сделает запрос более эффективным.

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