Bạn có thể làm điều gì đó như thế này
SELECT empno, date_created, time_in, time_out,
CASE WHEN total_hours - 8 > 0 THEN total_hours - 8 ELSE 0 END overtime
FROM
(
SELECT empno, date_created, time_in, time_out,
TIME_TO_SEC(TIMEDIFF(COALESCE(time_out, '17:00:00'),
COALESCE(time_in, '09:00:00'))) / 3600 total_hours
FROM
(
SELECT empno, date_created,
MIN(CASE WHEN status = 0 THEN time_created END) time_in,
MIN(CASE WHEN status = 1 THEN time_created END) time_out
FROM biometrics
GROUP BY empno, date_created
) a
) b
Đây là SQLFiddle bản demo
Bạn cần cung cấp các giá trị mặc định thực cho time_in
và time_out
đối với các trường hợp khi chúng là NULL
. Trong trường hợp cực đoan nếu NULL
là do nhân viên đến vào một ngày nọ và về nhà vào ngày khác, những giá trị mặc định đó có thể là 00:00:00
và 23:59:59
tương ứng vì bạn đang tính thời gian làm thêm mỗi ngày theo lịch.
CẬP NHẬT: nếu bạn muốn overtime
được trình bày ở định dạng thời gian
SELECT empno, date_created, time_in, time_out,
SEC_TO_TIME(
CASE WHEN total_sec - 28800 > 0
THEN total_sec - 28800
ELSE 0 END) overtime
FROM
(
SELECT empno, date_created, time_in, time_out,
TIME_TO_SEC(TIMEDIFF(COALESCE(time_out, '17:00:00'),
COALESCE(time_in, '09:00:00'))) total_sec
FROM
(
SELECT empno, date_created,
MIN(CASE WHEN status = 0 THEN time_created END) time_in,
MIN(CASE WHEN status = 1 THEN time_created END) time_out
FROM biometrics
GROUP BY empno, date_created
) a
) b
Đây là SQLFiddle bản demo