Нахождение сколько дней осталось на пользователя в год - PullRequest
0 голосов
/ 07 марта 2020

У меня есть таблица, которая отслеживает выходных дней для каждого пользователя:

    ID   |  Start      |       End     |    IDUser
     1   | 02-02-2020  |   03-02-2020  |       2
     2   | 01-02-2020  |   21-02-2020  |       2

IDUser подключается к таблице пользователей, в которой есть столбцы IDUser и Username

У меня есть просмотр / выставка / запрос , который показывает данные предыдущих упомянутых столбцов ПЛЮС столбец с именем UsedDays, который подсчитывает, сколько дней отпуска было использовано :

DATEDIFF(DAY, dbo.leavedays.start, dbo.leavedays.[end]) + 1

Это то, что у меня сейчас есть:

    Start      |       End     |  IDUser  | UsedDays
  02-02-2020   |   03-02-2020  |     2    |     1     
  01-02-2020   |   21-02-2020  |     1    |     20

У каждого пользователя есть общее доступное количество дней в году, поэтому я хотел бы иметь столбец, который вычитается из общего числа возможных дней каждого пользователя, и покажите, сколько осталось.

Пример:

У Джона (IDUser = 2) в этом году доступно 30 дней, и он уже использовал 1, поэтому осталось 29 дней

    Start      |       End     |  IDUser  | TotalDaysYear | UsedDays | LeftDays
  02-02-2020   |   03-02-2020  |     2    |      30       |     1    |    29
  01-02-2020   |   21-02-2020  |     1    |      20       |     20   |     0

Я считаю, что мне нужно создать таблицу для TotalDaysYear, вероятно, с:

    ID   |  Year   |  TotalDaysYear | IDUser
     1   |  2020   |       30       |    2
     2   |  2020   |       20       |    1

IDUser подключается к таблице пользователей, в которой есть столбцы IDUser и Username

Но я не могу найти логи c для и как найти желаемый результат, так как он зависит также от года (количество дней в году может меняться для каждого пользователя).

1 Ответ

1 голос
/ 07 марта 2020

Предполагается, что вы используете SQL Сервер, это должно работать:

SELECT 
    ld.start,
    ld.[end],
    ld.IDUser,
    ldy.TotalDaysYear,
    SUM(DATEDIFF(DAY, ld.start, ld.[end])+1) OVER (PARTITION BY ld.IDUser, YEAR(ld.start) ORDER BY ld.start) as UsedDays,
    ldy.TotalDaysYear -  SUM(DATEDIFF(DAY, ld.start, ld.[end])+1) OVER (PARTITION BY ld.IDUser, YEAR(ld.start) ORDER BY ld.start) as LeftDays
FROM leavedays ld
LEFT JOIN leavedaysperyear ldy
    ON YEAR(ld.start) = ldy.Year AND ld.IDUser = ldy.IDUser

Основа c Идея состоит в том, чтобы иметь общее количество использованных дней на пользователя в год, а затем вычесть его до общего доступные дни для этого пользователя, в течение того же года.

Вот SQLFiddle

NB. Приведенный пример не обрабатывает периоды отпуска по годам

...