首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每天计算加班费

每天计算加班费
EN

Stack Overflow用户
提问于 2013-07-16 03:39:26
回答 2查看 1.3K关注 0票数 2

我有一个sql代码,它获取每个员工的总工作时间和他的超时时间。我想计算一下他一天工作的总加班时间。你能帮我吗?8小时是每天的固定时间。

这是密码

代码语言:javascript
复制
SELECT
  empno,
  date_created,
  time_in,
  time_out,
  time_format(timediff(time_out, time_in), '%H:%i') AS total_time
FROM
(
  SELECT empno, date_created,
    min(CASE WHEN status = 0 THEN time_created END) time_in,
    max(CASE WHEN status = 1 THEN time_created END) time_out
  FROM biometrics
  WHERE empno = 3
  GROUP BY empno, date_created
) t1;

样本输出

代码语言:javascript
复制
empno| date_created | time_in | time_out
  2      2013-07-15   11:08:07  15:00:00
  3      2013-07-15   11:50:00  NULL
  4      2013-07-15    NULL     16:00:00

我想要的是这样的

代码语言:javascript
复制
empno | date_created | time_in | time_out | overtime
 2       2013-07-15    5:00:00  15:00:00      2
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-16 04:03:13

你可以做这样的事

代码语言:javascript
复制
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

这是SQLFiddle演示

time_intime_outNULL时,您需要为它们提供实际的默认值。在极端情况下,如果NULL是由雇员一天来一天回家造成的,那么这些默认值可能分别是00:00:0023:59:59,因为您是在计算每个日历日的加班时间。

更新:如果您希望以时间格式显示overtime,则为

代码语言:javascript
复制
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

这是SQLFiddle演示

票数 2
EN

Stack Overflow用户

发布于 2013-07-16 04:07:37

代码语言:javascript
复制
SELECT IFNULL(TIMEDIFF('08:00:00',(TIMEDIFF(time_out,time_in))),0) 
AS OVERTIME
FROM biometrics
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17667613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档