Нужна помощь в расчете рабочего времени - PullRequest
1 голос
/ 04 октября 2010

alt text

Способ, которым я разработал свой рабочий лист, не помогает мне легко рассчитать рабочее время.

Вывод в снимке был получен из нескольких таблиц.

Не беспокойтесь о форматировании setDate и timeEntered.

SetDate представляет рабочий день.tsTypeTitle представляет тип смены, это время обеда и т. д. timeEntered представляет фактическое время.

setDate должен быть обрезан, чтобы иметь только Date, а timeEntered должен показывать только время - это будет обработано позжеНе беспокойтесь об этом.

Мне нужно взять разницу между Shift Started и Shift Ended, чтобы я мог рассчитать заработную плату.

Вот мой запрос на тот случай, если вы захотите взглянуть на него:

SELECT TimeSheet.setDate, TimeSheetType.tsTypeTitle, TimeSheetDetail.timeEntered
FROM TimeSheet 
    INNER JOIN TimeSheetDetail 
        ON TimeSheet.timeSheetID = TimeSheetDetail.timeSheetID
    INNER JOIN TimeSheetType 
        ON TimeSheetType.timeSheetTypeID = TimeSheetDetail.timeSheetTypeID

Ответы [ 3 ]

1 голос
/ 04 октября 2010

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

Глядя на предоставленный вами дизайн, вы, похоже, упускаете уникальный идентификаторпользователь или человек, который соответствует данным табеля рабочего времени.Необходим уникальный идентификатор, даже если вы в настоящее время храните данные только для одного пользователя / человека.Если вам когда-либо понадобится хранить данные для большего числа пользователей / людей, это станет возможным благодаря уникальному идентификатору.

1 голос
/ 04 октября 2010

Предполагая, что каждый человек имеет 4 одинаковых события (начало / конец смены, начало / конец смены) каждый день, вы можете сделать что-то подобное.Очевидно, я сделал предположения для ваших значений идентификатора TimeSheetType.Замените соответствующие идентификаторы в вашей версии.

SELECT t.TimeSheetID, DATEDIFF(HOUR, tsd1.timeEntered, tsd4.timeEntered) - DATEDIFF(HOUR, tsd2.timeEntered, tsd3.timeEntered) as WorkingHours
    FROM TimeSheet t
        INNER JOIN TimeSheetDetail tsd1
            ON t.timeSheetID = tsd1.timeSheetID
                and tsd1.timeSheetTypeID = 1 /* Shift Started */
        INNER JOIN TimeSheetDetail tsd2
            ON t.timeSheetID = tsd2.timeSheetID
                and tsd2.timeSheetTypeID = 2 /* Lunch Started */
        INNER JOIN TimeSheetDetail tsd3
            ON t.timeSheetID = tsd3.timeSheetID
                and tsd3.timeSheetTypeID = 3 /* Lunch Ended */
        INNER JOIN TimeSheetDetail tsd4
            ON t.timeSheetID = tsd4.timeSheetID
                and tsd4.timeSheetTypeID = 4 /* Shift Ended */
0 голосов
/ 04 октября 2010

Таблицы сведений о расписании обычно содержат идентификатор человека. Я полагаю, что это было опущено, ради простоты.

Предполагая, что для любого данного дня всегда будет одно и только одно событие для каждого из Shift Started, Lunch Started, Lunch Ended и Shift Ended (в этом порядке), что обед должен быть исключен из общего количества часов и что нет других типов событий, попробуйте:

with
(SELECT TimeSheet.setDate, 
       TimeSheetType.tsTypeTitle, 
       TimeSheetDetail.timeEntered,
       convert(datetime,convert(varchar(10),TimeSheetDetail.timeEntered,112),112) dayEntered
FROM TimeSheet 
    INNER JOIN TimeSheetDetail 
        ON TimeSheet.timeSheetID = TimeSheetDetail.timeSheetID
    INNER JOIN TimeSheetType 
        ON TimeSheetType.timeSheetTypeID = TimeSheetDetail.timeSheetTypeID)
as TS
select dayEntered, 
       datediff(ss,max(case when tsTypeTitle = 'Shift Started' then timeEntered end),
                   max(case when tsTypeTitle = 'Shift Ended' then timeEntered end)) -
       datediff(ss,max(case when tsTypeTitle = 'Lunch Started' then timeEntered end),
                   max(case when tsTypeTitle = 'Lunch Ended' then timeEntered end)) daysSeconds
from TS
group by dayEntered
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...