Mysql
 sql >> база данни >  >> RDS >> Mysql

Изчислете извънредния труд на ден

Можете да направите нещо подобно

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

Ето SQLPiddle демонстрация

Трябва да предоставите реални стойности по подразбиране за time_in и time_out за случаите, когато са NULL . В краен случай, ако NULL са причинени от факта, че служителите идват един ден и се прибират другия ден, тези стойности по подразбиране може да са 00:00:00 и 23:59:59 съответно, тъй като изчислявате извънреден труд за календарен ден.

АКТУАЛИЗИРАНЕ: ако искате overtime да бъдат представени във формат за време

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

Ето SQLPiddle демонстрация



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да добавя два резултата count(*) заедно в две различни таблици?

  2. MySQL PHP count(*) връща нещо странно

  3. mysql concat_ws без дубликати

  4. MySQL - Как да преброите всички редове на таблица в една заявка

  5. mysql_query() очаква параметър 2 да бъде ресурс, даден низ