2017-01-09 2 views
1

У меня есть таблица mysql с данными, связанными с датой и временем. Каждая строка содержит данные и дату, например:Выбрать все данные разные секунды между двумя датами времени

datetime    name 
2009-06-25 10:00:00 jhon 
2009-06-25 10:00:05 jack 
2009-06-25 10:00:11 json 
2009-06-25 10:00:15 jack 

Моя проблема мне нужно, чтобы получить строки другого, второго date1 и date2 вроде этого:

datetime    name  second 
2009-06-25 10:00:00 jhon  0 
2009-06-25 10:00:05 jack  5 
2009-06-25 10:00:11 json  6 
2009-06-25 10:00:15 jack  4 

Спасибо вам

+0

Правильно, я удалю комментарий –

+0

используйте self join, чтобы получить это –

ответ

1

Функциональность вы ищете LAG, который доступен как аналитическая функция во многих базах данных, хотя и не в MySQL. Однако вы можете имитировать эту функциональность с использованием переменных сеанса.

SET @dt = (SELECT MIN(UNIX_TIMESTAMP(datetime)) FROM yourTable); 

SELECT t.datetime, 
     t.name, 
     t.curr_dt - t.lag_dt AS second 
FROM 
(
    SELECT @dt:=UNIX_TIMESTAMP(datetime) curr_dt, 
      @dt lag_dt, 
      datetime, 
      name 
    FROM yourTable 
    ORDER BY datetime, name 
) t 
+0

. Это подход довольно быстрый. – sumit

+0

@tim .. показывает показ разницы секунд в ноль во всех строках .. не в соответствии с ожидаемым пользователем ..http: // sqlfiddle .com/#! 9/a295e8/3 –

+0

@AnkitAgrawal Сессионные переменные, похоже, не работают в Fiddle. Вам нужно будет протестировать его в реальном Workbench. –

0

В результате:

[SQL] SET @dt = (SELECT MIN UNIX_TIMESTAMP (DateTime) FROM gps_trs_location); [Err] 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует версии сервера MySQL для правильного синтаксиса, чтобы использовать вблизи «(DateTime) FROM gps_trs_location)» в строке 1

+0

Опечатка, используйте это: 'SET @dt = (SELECT MIN (UNIX_TIMESTAMP (datetime)) FROM theTable);' –

1

Вы можете найти ближайшую дату и найти разницу как ниже

select 
    datetime, 
    name, 
    TIME_TO_SEC(TIMEDIFF(datetime, prev_date)) diff 
    FROM 
    (
     SELECT 
     datetime, 
     name, 
     (select datetime from tbl t1 where t1.datetime<tbl.datetime order by datetime desc limit 1) as prev_date 
     FROM 
     `tbl` 
    )tmp 
+0

Это хорошая альтернатива к ответу, который я дал, и должно быть хорошо для наборов данных разумного размера. –

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