sql >> Databáze >  >> RDS >> Mysql

Počítejte přesčasy za den

Můžete udělat něco takového

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

Zde je SQLFiddle demo

Musíte zadat skutečné výchozí hodnoty pro time_in a time_out pro případy, kdy jsou NULL . V extrémním případě, pokud NULL s jsou způsobeny skutečností, že zaměstnanci jeden den přijdou a druhý den odcházejí domů, tyto výchozí hodnoty mohou být 00:00:00 a 23:59:59 respektive protože počítáte přesčasy za kalendářní den.

AKTUALIZACE: pokud chcete overtime být prezentován v časovém formátu

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

Zde je SQLFiddle demo



  1. Problémy s výkonem u SQL Server 2012 Enterprise Edition v rámci licence CAL

  2. zobrazit nový řádek mysql v HTML

  3. Oracle Date TO_CHAR('Month DD, YYYY') má v sobě mezery navíc

  4. Neanglické znaky se na mé stránce php objevují jako otazníky - v databázi se zobrazují dobře