2013-03-01 107 views
0

我正在创建一个个人时间卡系统作为宠物项目,除了每天和每周的总计次数外,比方说,我为今天4拳从我的数据库使用while循环拉:高级时间戳计算(偶数行和总行数)

[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

你想让它吐出尽可能多的行数,等于8小时?这有点令人困惑,最后的数字代表什么? – Zachrip 2013-03-01 15:10:40

+0

为了清晰起见,我编辑了时间戳。这些是代表我(例如)为今天分手的时间卡牌拳。我在上午7点,下午12点,下午12点30分和下午3点30分钟进行了总计8小时的工作。我如何使用PHP自动累计这些小时数?谢谢! – 2013-03-01 15:16:33

+1

它们就像那样存储?这可能有点难以操纵,我建议可能使用sql将它们存储在“日期”和“时间”列中。但最简单的方法是做到这一点:(4-1) - (3-2) – Zachrip 2013-03-01 15:23:35

回答

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”是晚于“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语句的可更新视图,
  • 更新应用程序代码使用的视图,最后
  • 更换在答案的开始处查看基表。
+0

这对我将来非常有用,谢谢!我遇到的问题是整个剧本已经编好了我的结构。有没有办法用SELECT查询一次检索两个结果,或者使用unix时间戳减去差异?再次感谢! – 2013-03-01 19:22:53

+1

已更新的答案。忽略Unix时间戳,因为我讨厌将Unix时间戳存储在数据库中,并且像太阳一样燃烧。 – 2013-03-01 22:23:11

+0

这太棒了,谢谢! – 2013-03-04 15:24:12