MySQL - как найти разницу между каждой строкой

0

Привет, мастер программирования,

Мне нужна помощь в этом. Это данные сотрудника, NULL в TerminationDate относятся к текущей дате, это означает, что сотрудник все еще работает. Мне нужно найти самое длинное время (в днях), когда никто не нанимается или не прекращается.

Название таблицы: Имя столбца Employee: ID, HireDate, TerminationDate

Employee

ID  HireDate    TerminationDate
1   2009-06-20  2016-01-01
2   2010-02-12  NULL
3   2012-03-14  NULL
4   2013-09-10  2014-01-01
5   2013-09-10  NULL
6   2015-04-10  2015-05-01
7   2010-04-11  2016-01-01
8   2012-05-12  NULL
9   2011-04-13  2015-02-13

Я разработал процесс того, что нужно делать

  1. Объедините данные в HireDate и TerminationDate (он должен содержать 18 строк)
  2. Заказать дату
  3. Найдите разницу между каждой датой из строк (n) и строки (n-1)
  4. Получите максимальную разницу

Однако я не знаю, как это сделать в MySQL или если это возможно. Интересно, есть ли какой-нибудь другой метод? пожалуйста, помогите мне

Теги:

1 ответ

0

Это довольно сложно в MySQL, до версии 8. Но вы можете сделать:

select dte, next_dte, 
       datediff(coalesce(next_dte, curdate()), dte) as diff
from (select dte,
             (select min(d2.dte)
              from ((select hiredate as dte
                     from t
                    ) union   -- intentionally remove duplicates
                    (select terminationdate as dte
                     from t
                     where teminationdate is not null
                    )
                   ) d2
              where d2.dte > d.dte
             ) next_dte
      from ((select hiredate as dte
             from t
            ) union   -- intentionally remove duplicates
            (select terminationdate as dte
             from t
             where teminationdate is not null
            )
           ) d
     ) d
order by diff desc
limit 1;

Обратите внимание, что это находит последний период, основанный на текущей дате. Вы можете отрегулировать это, заменив curdate() на любую дату отсечения, которую вы имеете в виду. Если вам не нужен последний период, добавьте, where next_dte is not null для внешнего запроса.

Ещё вопросы

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