繁体   English   中英

如何从Timediff结果中添加或减去分钟

[英]How to add or substract minutes from a timediff result in mysql

我正在尝试进行查询,以显示所有工作时间,天数和人员。 我有那种快感。

假设我有一个叫做uren的表:

rec_id | user_id | start (datetime) | eind (datetime)

我有一个叫用户的表

user_id | name        |

在下面的查询中,我几乎拥有了我想要的所有信息。

select users.name, sec_to_time(SUM(TIME_TO_SEC(TIMEDIFF(uren.eind, uren.start)))),count(distinct(date(start))) as dagen
from uren, users
where date(uren.start) between CAST('2017-10-04 00:00:00' as Date) and CAST('2017-11-04 00:00:00' as DATE) and
      uren.user_id = users.user_id
group by uren.user_id
ORDER BY name

这告诉我这个

Piet (name) 230 (hours total) 24(days worked)

现在是真正的问题:

我想减去每天工作少于5小时的30分钟。

我无能为力的atm。 有人可以帮忙吗

假设每个用户每天一行:

select users.name,
       (sec_to_time(sum(time_to_sec(timediff(uren.eind, uren.start))) -
                    30 * 60 * sum(time_to_sec(timediff(uren.eind, uren.start)) < 5*60*60)
                   )
       ),
       count(distinct(date(start))) as dagen
from uren join users
     on uren.user_id = users.user_id
where date(uren.start) between '2017-10-04' and '2017-11-04'   
group by uren.user_id
order by name;

如果某天有多个班次,则需要先按天汇总:

select u.name,
       (sec_to_time(sum(day_secs) -
                    30 * 60 * sum(day_secs < 5*60*60)
                   )
       ),
       count(*) as dagen
from (select uren.user_id, uren.name, date(uren.start),
             sum(time_to_sec(timediff(uren.eind, uren.start))) as day_secs
      from uren join
           users
           on uren.user_id = users.user_id
      where uren.start >= '2017-10-04' and uren.start < '2017-11-05'   
      group by uren.user_id, date(uren.start)
     ) u
group by name
order by name

您没有线索是有充分的理由的。 这是因为您要问的内容很复杂。

您需要接受的第一件事(我的意思是绝望地接受)是您的功能取决于天数和用户,因此,首先需要对两者进行分组,然后在最终结果中仅按用户分组。 为此,在父级可以按用户分组之前,您将需要一个按天和用户分组的子查询。

这是我想出的...

SELECT 
users.name,
sec_to_time(SUM(ur.timeWorked)) as tWorked,
SUM(ur.dagen) as Dagen

 FROM users
 INNER JOIN ( 

   SELECT
   user_id,

   SUM(TIME_TO_SEC(TIMEDIFF(`eind`, `start`))) - (1800 * 
     IF(SUM(TIME_TO_SEC(TIMEDIFF(`eind`, `start`))) < 18000,1,0))
   as `timeWorked`,

  count(distinct(date(`start`))) as `dagen`

  FROM uren

  WHERE date(`start`) 
    BETWEEN CAST('2017-10-04 00:00:00' as Date) 
    AND CAST('2017-11-04 00:00:00' as DATE)
      GROUP BY user_id, DAYOFYEAR(`start`)

    ) as ur ON ur.user_id = users.user_id

GROUP BY ur.user_id
ORDER BY name

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM