Хотите сделать итерацию в две даты, связанные с другими данными - PullRequest
0 голосов
/ 04 мая 2020

У меня есть представление в sql серверной базе данных, в которой указана посещаемость сотрудника и данные, хранящиеся следующим образом

------------------------------------------------------------------
ID   | EmpID |  Name   |  ArrivalTime | LeavingTime | DayDate
------------------------------------------------------------------
1    |  5    | Hassan  | 9.00AM       | 5.50PM      | 19-11-2010
------------------------------------------------------------------
1    |  5    | Hassan  | 8.50AM       | 5.00PM      | 20-11-2010
------------------------------------------------------------------
1    |  5    | Hassan  | 8.30AM       | 4.54PM      | 23-11-2010
------------------------------------------------------------------

. И его начальная дата в этой компании хранится в основной EmployeeTable как столбец StartDate и его конечная дата. Также я хочу получить дни отсутствия для этого сотрудника на основе данных выше, и он должен начинаться с StartDate, сохраненного в EmployeeTable, и заканчиваться EndDate, сохраненным либо если у него есть EndDate. Например, этот Сотрудник начинает работать с нами 20-10-2010, и его первый день в таблице посещаемости - 5-11-2010. Я хочу, чтобы все эти дни упоминались в представлении изо дня в день, как

------------------------------------------------------------------
ID   | EmpID |  Name   | AbsenceDay
------------------------------------------------------------------
1    |  5    | Hassan  | 21-10-2010
------------------------------------------------------------------
1    |  5    | Hassan  | 22-10-2010
------------------------------------------------------------------
1    |  5    | Hassan  | 23-10-2010
------------------------------------------------------------------

и так далее, а также

------------------------------------------------------------------
ID   | EmpID |  Name   | AbsenceDay
------------------------------------------------------------------
1    |  5    | Hassan  | 21-11-2010
------------------------------------------------------------------
1    |  5    | Hassan  | 22-11-2010
------------------------------------------------------------------

день отсутствия в AttendanceTable. Заранее спасибо.

1 Ответ

0 голосов
/ 04 мая 2020

Я понимаю, что вам нужны все даты, за которые сотрудник не присутствовал в течение периода занятости.

Один из вариантов - использовать рекурсивный запрос для создания списка дней занятости, а затем отфильтровать его с помощью not exists.

with cte as (
    select empID, name, startDate, endDate from employees
    union all
    select empID, name, dateadd(day, 1, startDate), endDate 
    from cte 
    where startDate < endDate
)
select empID, name, startDate absenceDay
from cte c
where not exists (
    select 1 from attendances a where a.empID = c.empID and a.dayDate = c.startDate
)

Если периоды занятости охватывают более 3 месяцев, вы можете добавить option (maxrecursion 0) в самом конце запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...