2016-04-27 2 views
0

Я пытаюсь написать обширный запрос, который выполнит следующие задачи;MySQL Difference Query

  • Выберите поля «time_stamp» и «status» из базы данных «time_stamps» и закажите их с помощью «time_stamp» ASC.
  • Из возвращенных полей для каждой пары штампов времени (1 дюйм и 1 выход) мне нужно получить разницу в часах.

Вот что у меня до сих пор в запросе.

SELECT time_stamp AS 'time', status AS 'status' FROM time_stamps WHERE user_id = '55' ORDER BY time 

Тогда у меня есть этот запрос, который получает разницу в часах от двух дат.

SELECT TIMESTAMPDIFF(SECOND, '2016-04-26 07:01:26', '2016-04-26 15:07:55')/3600.0 

В идеале, я бы хотел, чтобы запрос возвращал данные, которые выглядят следующим образом:

time_stamp   status difference 
2016-04-18 06:57:04  1 
2016-04-18 11:19:49  0 8.11 
2016-04-18 11:41:01  1 
2016-04-18 15:21:02  0 3.67 
2016-04-19 07:06:16  1 
2016-04-19 10:58:34  0 3.87 
2016-04-19 11:18:50  1 
2016-04-19 15:16:00  0 3.95 
2016-04-20 06:58:30  1 
2016-04-20 12:46:33  0 5.80 

Я думал, что мне, возможно, придется написать хранимую процедуру или что-то подобное, чтобы выполнить это, но я не совсем уверен. Может ли кто-нибудь указать мне в правильном направлении, куда идти отсюда? Я не ищу, чтобы кто-то написал весь этот запрос для меня, просто толчок в правильном направлении. Благодаря!

ответ

0
SELECT time_stamp, status, 
     TIMESTAMPDIFF(
       SECOND, 
       (
       SELECT ti.time_stamp 
       FROM time_stamps ti 
       WHERE ti.user_id = t.user_id 
         AND ti.time_stamp <= t.time_stamp 
         AND t.status = 0 
         AND ti.status = 1 
       ORDER BY 
         ti.user_id DESC, ti.time_stamp DESC 
       LIMIT 1 
       ), 
       time_stamp 
       ) 
FROM time_stamps t 
WHERE user_id = :myuserid 

Создание составного индекса на (user_id, time_stamp) для этого, чтобы работать быстро.

+0

С некоторыми мастерами я получил ваш код, чтобы работать отлично. Спасибо за вашу помощь Квасной! – Kronos1

0

Просто толчок в правильном направлении, как вы просили:

Как насчет

SELECT @previous, @previous := `time_stamp`, `status` 
FROM time_stamps 
ORDER BY `time_stamp`; 

и работа от этого.

Обратите внимание, что порядок столбцов важен в этом случае. Если вы сначала назначите до извлечения, это не будет (очевидно, возможно) работать.

Доказательство концепции: http://sqlfiddle.com/#!9/4e17b5/2

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

  • Нет связанных вопросов^_^