Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Oblicz nadgodziny dziennie

Możesz zrobić coś takiego

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

Oto SQLFiddle demo

Musisz podać prawdziwe wartości domyślne dla time_in i time_out dla przypadków, gdy są NULL . W skrajnym przypadku, jeśli NULL s są spowodowane faktem, że pracownicy przychodzą jednego dnia i wracają do domu drugiego dnia, te domyślne wartości mogą wynosić 00:00:00 i 23:59:59 odpowiednio, ponieważ obliczasz nadgodziny na dzień kalendarzowy.

AKTUALIZACJA: jeśli chcesz overtime do przedstawienia w formacie czasu

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

Oto SQLFiddle 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. MySQL łączy się z klauzulą ​​where

  2. Jak wstawić kolumny w określonej pozycji w istniejącej tabeli?

  3. Prześlij na varchar

  4. mysql | Żądanie z pustej kolumny i FIND_IN_SET

  5. wstaw autoinkrementację do drugiej kolumny