Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Tính thời gian làm thêm mỗi ngày

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_intime_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:0023: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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Trả về NULL nếu Count (*) bằng 0

  2. Trình điều khiển Go Mysql có tồn tại hỗ trợ nhiều câu lệnh trong một chuỗi đơn không?

  3. cách tìm dữ liệu chính xác giữa vùng đường chéo đã chọn trong truy vấn mysql

  4. Cách xóa bản ghi MySQL sau một thời gian nhất định

  5. VB.NET:Bộ khởi tạo kiểu cho 'MySql.Data.MySqlClient.Replication.ReplicationManager' đã đưa ra một ngoại lệ