Как вывести даты окончания недели и конец месяца, когда конец месяца - середина недели - PullRequest
0 голосов
/ 19 февраля 2019

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

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

У меня также есть вторая таблица, в которой указаны даты окончания всех недель.по большей части это каждую субботу, однако, если месяц заканчивается в середине недели, то этот день является концом недели.Итак, январь у нас была конечная неделя 31 января и 1 февраля.

, где 31 января требовалось только 32 часа, а 2 февраля - 8 часов.

Пример данных

Week Ending Date   Minimum Hours
1/26/19             40
1/31/19             32
2/2/19              8
2/9/19              40

Образец таймкарты

NAME                WeekEnding           HoursWorked
Billy Joe           1/23/19               42
Homer               1/30/19               32
Marge               1/31/19               40
Homer               2/2/19                8

В идеале я хотел бы присоединиться к этим двум таблицам к дате недели, но иногда люди вводят свои даты на таймкартах неправильно.Скажем, они положили в 30 января до 31-го.Поэтому я не могу найти простой конец недели для TSQL.Поэтому, если бы я присоединился к 2 приведенным выше примерам, Гомер пропал бы 31-го числа, поскольку он ввел неправильную дату в своей карточке времени.

У меня есть 2 вопроса:

  1. Есть лиспособ найти неделю, заканчивающуюся на неделю, и если эта неделя является неделей окончания месяца, вместо этого она получает дату конца месяца?

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

1 Ответ

0 голосов
/ 19 февраля 2019

Было бы проще, если бы вы могли добавить столбец для хранения даты начала недели в вашей календарной таблице (таблица timecard).Тогда мы могли бы просто агрегировать все выборки, представленные в течение каждого интервала.

Учитывая текущую структуру базы данных, одним из решений было бы эмулировать это поведение, используя коррелированный подзапрос.Далее условие NOT EXISTS гарантирует, что мы объединяем текущую запись sample с соответствующей записью timecard.Внешний запрос выполняет агрегирование по имени и интервалу дат, а предложение HAVING BY фильтрует записи, в которых не было достигнуто минимальное количество рабочих часов.

SELECT
    s.name,
    s.WeekEnding DateEntered,
    t.WeekEnding,
    t.MinimumHours,
    SUM(s.HoursWorked) TotalHoursWorked
FROM sample s
INNER JOIN timecard t 
    ON s.WeekEnding <= t.WeekEnding
    AND NOT EXISTS (
        SELECT 1
        FROM timecard t1
        WHERE s.WeekEnding <= t.WeekEnding AND t1.WeekEnding > t.WeekEnding
    )
GROUP BY
    s.name,
    s.WeekEnding,
    t.WeekStart,
    t.WeekEnding,        
    t.MinimumHours
HAVING SUM(s.HoursWorked) < t.MinimumHours

Начиная с SQLServer 2017, оконные функциисделать это проще.Мы можем получить доступ к предыдущей записи, используя LAG():

SELECT
    s.name,
    s.WeekEnding DateEntered,
    t.WeekStart,
    t.WeekEnding,        
    t.MinimumHours,
    SUM(s.HoursWorked) TotalHoursWorked
FROM
    sample s
    INNER JOIN (
        SELECT 
            WeekEnding, 
            MinimumHours, 
            LAG(WeekEnding) OVER(ORDER BY WeekEnding) WeekStart
        FROM timecard
    ) t 
        ON s.WeekEnding > t.WeekStart AND s.WeekEnding <= t.WeekEnding
GROUP BY
    s.name,
    s.WeekEnding,
    t.WeekStart,
    t.WeekEnding,        
    t.MinimumHours
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...