0

我正在创建一个个人时间卡系统作为一个宠物项目,除了每天和每周的总时间外,我已经完成了所有工作。假设我使用 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 小时的运行总计?我已经考虑了好几天了,但我的脑海中没有合乎逻辑的解决方案。提前致谢!

4

1 回答 1

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';

如果让我选择,我会

  • 从最后一个 SELECT 语句构建一个可更新的视图,
  • 更新应用程序代码以使用视图,最后
  • 用这个答案开头的基表替换视图。
于 2013-03-01T15:55:48.370 回答