Как сделать статус, сравнив даты - PullRequest
0 голосов
/ 22 февраля 2011

Использование SQL Server 2005

Выйти из таблицы

ID StartDate EndDate 

001 04/01/2010 04/02/2010
002 04/02/2010 04/03/2010
…

Таблица событий

ID Date PresentDate Status

001 03/30/2010 03/30/2010 Present
001 03/31/2010 null       absent
001 04/01/2010 null       Leave
001 04/02/2010 null       Leave
001 04/03/2010 null       absent
001 04/04/2010 04/04/2010 Present
….

Все типы данных Datecolumn имеют дату и время

В столбце состояния, если текущая дата равна нулю, она будет отображаться как «отсутствующая», если не нулевая, то она будет отображаться как «присутствующая». Теперь, если мы применим отпуск к дате, он будет отображаться как «Оставить» в столбце статуса.

Запрос

Select 
    id, date, present date
    , CASE WHEN t2.id IS NULL THEN t1.Status ELSE ‘Leave’ END AS status 
from event table as t1 
left outer join leave table as t2 on 
    t1.id = t2.id and t1.date between t2.startdate and t2.enddate

Вышеупомянутый метод работает, но мне нужно добавить еще одно условие.

Однажды, если мы применили отпуск для конкретного сотрудника в Таблице отпусков, он должен сравнить столбец «Текущая дата», если столбец «Текущая дата» пуст, то он должен отображаться как «отпуск»

Ожидаемый результат

ID Date PresentDate Status

001 03/30/2010 03/30/2010 Present
001 03/31/2010 null       absent
001 04/01/2010 null       Leave
001 04/02/2010 null       Leave
001 04/03/2010 null       Leave (Expect this value)
001 04/04/2010 04/04/2010 Present
….

Исходя из вышеприведенного вывода, Leave начинается с 01.04.2010 по 04.02.2010, затем следующий столбец текущей даты равен NULL, тогда статус должен отображаться как «Leave», если текущая дата не равна NULL, то должна отображается как «Настоящее время.

»

Метод

We can display as "Leave" in status column from Start Date to end date of leave table, after that leave date end then we can compare with PresentDate column, if PresentDate column is null then it should display as "Leave", once data is available in present column then status should display with normal condition.

Как сделать запрос для вышеуказанного условия.

Нужна помощь по запросу

1 Ответ

2 голосов
/ 22 февраля 2011
select E.id, E.date, E.presentdate, *,
    case
    when E.presentdate is not null then 'Present'
    when E2.presentdate is not null then 'Absent'
    when L.ID is not null then 'Leave'
    else 'Absent'
    end
from Event E
outer apply (
    select top 1 *
    from Leave L
    where E.presentdate is null and E.date >= L.startdate
      AND e.ID = L.ID
    order by L.startDate desc) L
outer apply (
    select top 1 *
    from Event E2
    where E.presentdate is null
      and E2.presentdate is not null
      and E.date >= E2.date and E2.date > L.startdate      
      AND e2.ID = e.ID
    order by E2.presentdate desc) E2
order by E.date

Выйти из стола

ID          StartDate               EndDate
----------- ----------------------- -----------------------
1           2010-04-01 00:00:00.000 2010-04-02 00:00:00.000
1           2010-04-02 00:00:00.000 2010-04-03 00:00:00.000
1           2010-04-05 00:00:00.000 2010-04-05 00:00:00.000

Выход

id          date                    presentdate             
----------- ----------------------- ----------------------- -------
1           2010-03-30 00:00:00.000 2010-03-30 00:00:00.000 Present
1           2010-03-31 00:00:00.000 NULL                    Absent
1           2010-04-01 00:00:00.000 NULL                    Leave
1           2010-04-02 00:00:00.000 NULL                    Leave
1           2010-04-03 00:00:00.000 NULL                    Leave -**
1           2010-04-04 00:00:00.000 2010-04-04 00:00:00.000 Present
1           2010-04-05 00:00:00.000 NULL                    Leave
1           2010-04-06 00:00:00.000 NULL                    Leave -**
1           2010-04-07 00:00:00.000 NULL                    Leave -**
1           2010-04-08 00:00:00.000 2010-04-08 00:00:00.000 Present
1           2010-04-09 00:00:00.000 NULL                    Absent
1           2010-04-10 00:00:00.000 NULL                    Absent
1           2010-04-11 00:00:00.000 2010-04-11 00:00:00.000 Present

Те, которые отмечены - **, не охватываются записями об отпуске, но они показывают отпуск, потому что они следуют за периодом отпуска, верно? 2010-04-09 например, остается «Отсутствует», потому что следует за текущей записью (без фактического присутствия).

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