我正在试图弄清楚如何计算已经或需要支付的计时卡账单的加班费。问题是账单覆盖了超过一周的时间,而且查询一次只能获得一个以上员工的历史记录。关于如何做到这一点的任何建议,也许是某种案例陈述?
例如,假设在我的员工列表中,一周工作39小时,下一年工作45小时。该法案将显示84小时工作,并且还需要显示5小时的加班时间(而不是4小时!)。这需要在以下查询的上下文中完成,该查询处理多个账单和多个员工。
请注意,下面的查询显示了如果结算周期只有一周,这将如何运作。
select
username,
CASE
WHEN paidOn IS NULL THEN 'Unpaid'
ELSE paidOn
END as paid,
round(sum(TIME_TO_SEC(TIMEDIFF(timeOut, timeIn)))/3600,2) AS hours
, CASE
WHEN round(sum(TIME_TO_SEC(TIMEDIFF(timeOut, timeIn)))/3600,2) > 40
THEN round((sum(TIME_TO_SEC(TIMEDIFF(timeOut, timeIn)))/3600 - 40) * payrate + 40 * payrate,2)
ELSE
round(sum(TIME_TO_SEC(TIMEDIFF(timeOut, timeIn)))/3600 * payrate, 2)
END as pay
from
timecard
LEFT JOIN
employees
ON
employees.userID = timecard.userID
WHERE
paid != 'd'
GROUP BY
paidOn, timecard.userID
ORDER BY
paid DESC
LIMIT 30;
答案 0 :(得分:1)
我理解的方法是,如果结算周期仅为1周,则可以正常工作,但是当您将其延长至数周时,则无效。然后我会简单地使用您上面的查询作为子查询,然后将您的周数汇总在一起。这是我的意思的简短例子:
SELECT
EmployeeId,
SUM(RegularPayHours) * RegularPayRate,
SUM(OverTimeHours) * OverTimeRate
FROM
(SELECT
EmployeeId,
DATEPART(week,TimeCardDate) AS [WorkWeek],
CASE WHEN SUM(HoursWorked) > 40 THEN 40 ELSE SUM(HoursWorked) END AS [RegularPayHours],
CASE WHEN SUM(HoursWorked) > 40 THEN SUM(HoursWorked) - 40 ELSE 0 END AS [OvertimeHours]
FROM
TimeCard
WHERE
TimeCardDate BETWEEN StartDate AND EndDate
GROUP BY
EmployeeId,
DATEPART(week,TimeCardDate)
) a
WHERE
WorkWeek IN (1,2)
GROUP BY
EmployeeId
这将给你前两个工作周合并为一个结果,但加上一周的加班计算。您实际上可以使用此方法创建X周的任何自定义付款期。
您可能需要通过设置DATEFIRST值来自定义工作周。