MySQL时间卡超时两周

时间:2013-06-12 18:02:05

标签: mysql time case

我正在试图弄清楚如何计算已经或需要支付的计时卡账单的加班费。问题是账单覆盖了超过一周的时间,而且查询一次只能获得一个以上员工的历史记录。关于如何做到这一点的任何建议,也许是某种案例陈述?

例如,假设在我的员工列表中,一周工作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;

1 个答案:

答案 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值来自定义工作周。

相关问题