你应该大概改变你的表的结构。其基本思想是工作期间的概念,需要一个开始时间和结束时间。目前的结构将这一事实分成两行。改为使用一行。
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”是晚于“in”的最早的“out”。
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语句的可更新视图,
- 更新应用程序代码使用的视图,最后
- 更换在答案的开始处查看基表。
你想让它吐出尽可能多的行数,等于8小时?这有点令人困惑,最后的数字代表什么? – Zachrip 2013-03-01 15:10:40
为了清晰起见,我编辑了时间戳。这些是代表我(例如)为今天分手的时间卡牌拳。我在上午7点,下午12点,下午12点30分和下午3点30分钟进行了总计8小时的工作。我如何使用PHP自动累计这些小时数?谢谢! – 2013-03-01 15:16:33
它们就像那样存储?这可能有点难以操纵,我建议可能使用sql将它们存储在“日期”和“时间”列中。但最简单的方法是做到这一点:(4-1) - (3-2) – Zachrip 2013-03-01 15:23:35