您可能应该更改表的结构。基本思想是工作周期的概念,它需要一个开始时间和一个结束时间。当前的结构将该事实分成两行。改为使用一排。
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';
如果让我选择,我会
- 从最后一个 SELECT 语句构建一个可更新的视图,
- 更新应用程序代码以使用视图,最后
- 用这个答案开头的基表替换视图。