mysql 数据查询 按天计算求教

咿呀咿呀吼 2018-06-08 11:31:27

如图,计算一个人的工作时长,数据可能有跨天的情况,现在需求是查询出
每天这个人的工作时长(如:1号2小时,2号1小时,3号3小时)单独查询一
天的已经完成,现在要查询一月每天的时长,不能发出30个请求吧。请大神
赐教。万分感谢
...全文
563 点赞 收藏 7
写回复
7 条回复
咿呀咿呀吼 2018年06月09日
谢谢楼上大神的解疑。学习消化一下
回复 点赞
crynono 2018年06月08日
假设原始数据表为pt,有以下数据:

自己练手写了个存储过程,主要就是用到临时表和时间转换的一些函数知识。逻辑有点恶心,但能达到效果,一条跨几天也可以,代码如下:
drop PROCEDURE if EXISTS proc1;
create PROCEDURE proc1(in pid int,in startdate date,in enddate date) MODIFIES sql DATA
Home:
BEGIN
declare gt,it int;
declare stime,etime,temptime,preday datetime;
DECLARE done INT DEFAULT FALSE;
declare cur1 cursor for select starttime,endtime,
datediff(endtime,starttime) from pt where person_id=pid
and starttime>startdate and endtime<enddate
;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

if(startdate>enddate) then leave Home;
end if;
drop TEMPORARY table if EXISTS temptb;
create TEMPORARY table temptb(person_id int,rq date,xs int);

OPEN cur1;
read_loop: LOOP
FETCH cur1 INTO stime, etime, gt;
IF done THEN LEAVE read_loop;
END IF;
IF(gt=0) THEN
insert into temptb values
(pid,DATE_FORMAT(stime,'%Y-%m-%d'),TIMESTAMPDIFF(hour,stime,etime));
END IF;
IF(gt>0) THEN
set it=0;
while it<=gt DO
set temptime=date_add(stime,interval it+1 day);
set preday=date_add(stime,interval it day);
if it=0 THEN
insert into temptb values(pid,
DATE_FORMAT(stime,'%Y-%m-%d'),
TIMESTAMPDIFF(hour,stime,DATE_FORMAT(temptime,'%Y-%m-%d')));
elseif it=gt THEN
insert into temptb values(pid,
DATE_FORMAT(etime,'%Y-%m-%d'),
TIMESTAMPDIFF(hour,DATE_FORMAT(etime,'%Y-%m-%d'),etime));
ELSE
insert into temptb values(pid,
DATE_FORMAT(preday,'%Y-%m-%d'),24);
end if;
set it=it+1;
end while;
end if;
END LOOP;
CLOSE cur1;
select * from temptb;
end
调用 call proc1(2,'2018-06-01','2018-06-30') 参数含义:2表示person_id,后面两个表示要查询的起止日期。
执行结果如下,这里就不做group by和sum了:
回复 点赞
咿呀咿呀吼 2018年06月08日
引用 4 楼 qq_37496900 的回复:
你把要的预期结果写几个吧。。。

类似这样,例举了三天的数据。要统计1个月的。我表达清楚没有啊~~~
回复 点赞
o前男友o 2018年06月08日
你把要的预期结果写几个吧。。。
回复 点赞
咿呀咿呀吼 2018年06月08日
因为一条数据可能有跨两天的情况,所以好像不能单纯的group by 时间字段来解决~~~求大神答疑.
回复 点赞
咿呀咿呀吼 2018年06月08日
引用 1 楼 rucypli 的回复:
首先你得有个日期表
不是很懂。日期在起始时间和结束时间 就体现了,还要单独建表么?望指教
回复 点赞
rucypli 2018年06月08日
首先你得有个日期表
回复 点赞
发动态
发帖子
MySQL
创建于2007-09-28

2.4w+

社区成员

5.5w+

社区内容

MySQL相关内容讨论专区
社区公告
暂无公告