Вычисление даты и времени между строками

#mysql

#mysql

Вопрос:

У меня проблемы с вычислением времени между строками. Хотя я смог написать SQL, который дает правильное время.

 CREATE TABLE tab
    (`id` int,`station` varchar(10), `user` int, `create_at` datetime, `shift_end` datetime);
    
INSERT INTO tab
    (`id`, `create_at`, `user`, `station`, `shift_end`)
VALUES
    ( 1 , '2020-12-10 14:14:04',1,'S1', '2020-12-10 16:00:00'),
    ( 2 , '2020-12-10 14:14:09',1,'S2', '2020-12-10 16:00:00'),
    ( 3 , '2020-12-10 14:14:05',2,'S1', '2020-12-10 16:00:00'),
    ( 4 , '2020-12-10 14:14:15',2,'S2', '2020-12-10 16:00:00'),
    ( 5 , '2020-12-10 14:28:52',1,'S3', '2020-12-10 16:00:00');

SELECT
  id,
  create_at,
  user,
  station,
  shift_end,
  TIMESTAMPDIFF(SECOND,
    (SELECT MAX(create_at) FROM tab WHERE create_at < t.create_at and user = t.user),
    create_at
  ) AS x
FROM tab as t order by user, create_at
 

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

 id  create_at           user   station  shift_end            x
1   2020-12-10 14:14:04 1      S1       2020-12-10 16:00:00  5
2   2020-12-10 14:14:09 1      S2       2020-12-10 16:00:00  883
5   2020-12-10 14:28:52 1      S3       2020-12-10 16:00:00  NULL
3   2020-12-10 14:14:05 2      S1       2020-12-10 16:00:00  10
4   2020-12-10 14:14:15 2      S2       2020-12-10 16:00:00  NULL
 

Есть ли что-то еще, возможно ли вычислить время до значения в столбце shift_date в последних строках для данного пользователя?

 id  create_at            user   station  shift_end               x
5   2020-12-10 14:28:52  1      S3       2020-12-10 16:00:00     5468 (time between create_at AND shift_end)
 

Комментарии:

1. Какая версия MySQL, пожалуйста? Это важно, потому что v8 имеет так называемые оконные функции.

2. @O.Jones версия 8.0.22

Ответ №1:

Используйте LEAD() функцию окна:

 SELECT
  id,
  create_at,
  user,
  station,
  shift_end,
  TIMESTAMPDIFF(
    SECOND,
    create_at,
    LEAD(create_at) OVER (PARTITION BY user ORDER BY create_at)
  ) AS x
FROM tab
ORDER BY user, create_at
 

Смотрите демонстрацию.
Результаты:

 > id | create_at           | user | station | shift_end           |    x
> -: | :------------------ | ---: | :------ | :------------------ | ---:
>  1 | 2020-12-10 14:14:04 |    1 | S1      | 2020-12-10 16:00:00 |    5
>  2 | 2020-12-10 14:14:09 |    1 | S2      | 2020-12-10 16:00:00 |  883
>  5 | 2020-12-10 14:28:52 |    1 | S3      | 2020-12-10 16:00:00 | null
>  3 | 2020-12-10 14:14:05 |    2 | S1      | 2020-12-10 16:00:00 |   10
>  4 | 2020-12-10 14:14:15 |    2 | S2      | 2020-12-10 16:00:00 | null