mysql - 超过两周的 MySQL 考勤卡加类

标签 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 周,则此方法可以正常工作,但如果将其延长至数周,则效果不佳。然后,我将简单地使用您上面的查询作为子查询,然后将您的周汇总在一起。这是我的意思的一个简短示例:

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

关于mysql - 超过两周的 MySQL 考勤卡加类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17072217/

相关文章:

php - 限制给定秒数的 IP 访问

python - Python Pandas 中的情况条件

mysql - 使用背包包的 laravel 中表之间的关系

php - 如果数据表中的计数值为空,则隐藏空 td

java - 在 infinispan 中使用 (mysql) jdbc 存储时,__defaultcache' 不存在错误

php - sql中的引号导致问题

ruby-on-rails - RoR 3 将用户限制为每天 2 个帖子

php - Ruby Time.now.to_i PHP 等效项

mysql - 生成的sql案例

mysql - 当没有匹配项时,CASE 语句将我的所有值更新为 NULL?