高级时间戳计算(偶数和奇数行总计)

时间:2013-03-01 15:08:58

标签: php mysql date datetime time

我正在创建一个个人时间卡系统作为一个宠物项目,除了每天和每周的总时间外,我还有一切。假设我使用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小时的总计?我已经想过这几天没有逻辑解决方案了。提前谢谢!

1 个答案:

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

如果我有选择的话,我会

  • 从最后一个SELECT语句
  • 构建可更新的视图
  • 更新应用程序代码以使用视图,最后
  • 将此视图替换为此答案开头的基表。