mysql 数据查询 按天计算求教

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

如图,计算一个人的工作时长,数据可能有跨天的情况,现在需求是查询出
每天这个人的工作时长(如:1号2小时,2号1小时,3号3小时)单独查询一
天的已经完成,现在要查询一月每天的时长,不能发出30个请求吧。请大神
赐教。万分感谢
...全文
775 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
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
  • 打赏
  • 举报
回复
首先你得有个日期表

56,687

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧