Получил по запросу от одной компании тестовую задачу, чтобы прокачать свои текущие навыки, и понять уровень требований на рынке по моей специализации.
Описание задачи:
Размышления над реализацией:
- Если брать разность между датой начала и окончания работы пользователя с клиентом, то необходимо учитывать дополнительный день - день начала работы.
- Получить значение даты в следующей строке, чтобы установить значение DateEnd, можно следующим способом - делая выборку строк в обратном порядке (см. строка 10 реализации) и присваивая значение даты промежуточной переменной finishDate (см. строка 8 реализации) во вложенном запросе.
- Вложенный запрос позволяет получить данные в виде "table1" для создания результирующей выборки. В "table1" получаем дополнительное поле endDate - дата окончания обслуживания, присваиваем через промежуточную переменную finishDate.
- Для пользователя, который еще не закончил обслуживание, и продолжает работать с клиентом, значение даты окончания обслуживания endDate будет NULL, значит при проверке на NULL значения endData (см. строка 7 реализации), будет принимать либо значение из промежуточной переменной finishDate, либо текущую дату.
- Вычисление разницы между днем начала и окончания обслуживания, выпоняется (см. строка 4 реализации) с учетом дополнительного дня (см. п.1).
Вот такая итоговая реализация получилась: