我正在创建一个个人时间卡系统作为一个宠物项目,除了每天和每周的总时间外,我还有一切。假设我使用while循环从我的数据库中取出了4个拳头:
[1] 2013-03-01 07:00:00 - IN - (FOR DAY)
[2] 2013-03-01 12:00:00 - OUT (TO LUNCH)
[3] 2013-03-01 12:30:00 - IN (FROM LUNCH)
[4] 2013-03-01 15:30:00 - OUT (FOR DAY)
我的问题是如何创建一个总计8小时的总计?我已经想过这几天没有逻辑解决方案了。提前谢谢!
答案 0 :(得分:2)
您应该可能更改表格的结构。根本的想法是工作期的概念,它需要一个开始时间和一个结束时间。当前结构将该事实分成两行。请改用一行。
work_periods
time_in time_out
--
2013-03-01 07:00:00 2013-03-01 12:00:00
2013-03-01 12:30:00 2013-03-01 15:30:00
如果您有这样的表格,您可以通过timestampdiff()轻松获得分钟的差异。
select time_in, time_out,
timestampdiff(minute, time_in, time_out) elapsed_time
from work_periods;
您可以从现有表中返回相同的数据。我认为你应该只做一个临时的方法。这种结构使得很难识别缺少“out”的“in”和缺少“in”的“out”。
create table work_periods (
work_ts datetime not null,
in_or_out varchar(5) not null,
primary key (work_ts)
);
insert into work_periods values
('2013-03-01 07:00:00', 'IN'),
('2013-03-01 12:00:00', 'OUT'),
('2013-03-01 12:30:00', 'IN'),
('2013-03-01 15:30:00', 'OUT');
每个“in”的“out”是最早的“out”,它比“in”更晚。
select wp1.work_ts time_in,
(select min(wp2.work_ts)
from work_periods wp2
where wp2.work_ts > wp1.work_ts
and wp2.in_or_out = 'OUT') time_out
from work_periods wp1
where wp1.in_or_out = 'IN';
如果我有选择的话,我会