Запрос на оплату труда по часам - PullRequest
1 голос
/ 13 января 2012

Редактировать: См. Подсчитайте, сколько минут использовалось в данный час , как я в конечном итоге решил это.

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

EmployeeID  InTime   OutTime  PayRate  OTRate  DTRate
6           59:09.0  05:17.0  10.75    16.13   21.5
6           33:45.0  54:58.0  10.75    16.13   21.5
6           59:25.0  24:07.0  10.75    16.13   21.5
6           55:18.0  29:35.0  10.75    16.13   21.5
6           59:50.0  02:17.0  10.75    16.13   21.5
7           00:45.0  40:48.0  9.25     13.88   18.5
7           00:21.0  58:41.0  9.25     13.88   18.5
13          00:34.0  27:46.0  9        13.5    18
6           55:23.0  11:02.0  10.75    16.13   21.5
6           37:03.0  30:32.0  10.75    16.13   21.5

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

Редактировать: поля InTime и OutTime на самом деле являются DateTimes ... по какой-то причине он преобразовал значения, когда я копировал / вставлял

Редактировать: Результаты будут выглядеть как ...

Hour   Labor Cost

1:00       $
2:00       $
3:00       $
4:00       $
5:00       $
etc.

где $ - сколько было потрачено на труд за этот час. Итак, первое, о чем я думаю, это создать таблицу с 24 строками; по одному на каждый час. Затем время ввода / вывода будет присоединено к полю часа в новой таблице. Просто пытаясь придумать, как будет выглядеть это выражение объединения ...

Редактировать: Марк напомнил мне, что мне также нужно будет показать дату вместе с часом, который заставляет меня думать, что моя таблица из 24 строк должна будет составлять 24 *, сколько бы дней я ни опрашивал. Кроме того, я понял, что 1 запись в час не будет работать хорошо, потому что люди работают неполный час, поэтому я думаю, что мне нужно делать запись за каждую минуту, а затем группировать / суммировать эти результаты, чтобы получить точные данные.

1 Ответ

1 голос
/ 13 января 2012

Конечно, не проверял, но я считаю, что это должно работать без учета опечаток, которые я сделал:

-- Assume that there is a tblNumbers table
--  that has been populated with at least the values 0 to 60.
-- First, we need to find the days for which there are time records.
; WITH Days_cte (MyDay) AS
(
    SELECT DISTINCT
        -- Strip off the time from the date.  
        DATEADD(DAY, DATEDIFF(DAY, 0, InTime), 0) AS MyDay
    FROM tblTimeSheet

    UNION

    SELECT DISTINCT
        -- Strip off the time from the date.  
        DATEADD(DAY, DATEDIFF(DAY, 0, OutTime), 0) AS MyDay
    FROM tblTimeSheet
),
-- Next, explode this into hours AND minutes for every day.
-- This cte will contain 1440 records for every day.
Times_cte (MyTime) AS
(
    SELECT
        DATEADD(MINUTE, minutes.Number, 
                DATEADD(HOUR, hours.Number, days.MyDay)) AS MyTime
    FROM
        Days_cte days JOIN
        tblNumbers hours ON hours.Number < 24 JOIN
        tblNumbers minutes ON minutes.Number < 60 LEFT JOIN
)
-- Now, determine which of these minutes 
--  falls between an employee's in and out time.
SELECT
    -- Strip off the minutes, leaving only the hour.
    DATEADD(HOUR, DATEDIFF(HOUR, 0, times.MyTime), 0) AS [Hour],
    -- Divide by 60, since the aggregation is done by the minute.
    SUM(ISNULL(ts.PayRate, 0) / 60) AS LaborCost
FROM    
    Time_cte times LEFT JOIN
    tblTimeSheet ts ON times.MyTime BETWEEN ts.InTime AND ts.OutTime
GROUP BY
    DATEADD(HOUR, DATEDIFF(HOUR, 0, times.MyTime), 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...