支払われた、または支払われる必要があるタイムカード請求書の残業時間を計算する方法を見つけようとしています。問題は、請求書が 1 週間以上の時間をカバーし、クエリが一度に複数の従業員の履歴を取得することです。おそらく何らかのケースステートメントを使用して、これを行う方法に関する提案はありますか?
たとえば、私の従業員のリストで、週に 39 時間、次の週に 45 時間働く人がいるとします。請求書には 84 時間の労働が表示され、残業時間も 5 時間 (4 時間ではありません!) と表示する必要があります。これは、複数の請求書と複数の従業員を処理する以下のクエリのコンテキストで行う必要があります。
以下のクエリは、請求期間が 1 週間のみの場合にどのように機能するかを示しています。
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;