计算每天的“工作时间”和“午餐时间” - php / mysql

时间:2010-12-07 12:31:53

标签: php mysql

所有员工输入/输出数据输入都采用以下格式:

logtype                            time     Date  
------------------------------------------------------
start_time [come office]           10:30    11-11-2010
end_time [go to lunch]             14:00    11-11-2010 
start_time [come back from lunch]  15:00    11-11-2010
end_time [out from office]         20:00    11-11-2010

问题:

如何计算'start time''end time''total time including lunch time''total time excluding lunch time'

  1. 开始时间
  2. 结束时间
  3. 包括午餐时间在内的总时间
  4. 不包括午餐时间的总时间

1 个答案:

答案 0 :(得分:1)

我已经考虑过了,我没有看到这样做的方法,没有迭代每个项目并自己进行计算。您可以添加“日期”列(例如DAYOFMONTHDAYOFWEEKDAYOFYEAR),然后按“时间”升序开始浏览登录/退出时间。唯一的问题是“开放式”时间(用户没有进/出的情况)。

我见过的大多数时间表都使用(通常)4列消除了这一点。

  • Work_Day
  • Login_Time
  • Logout_Time
  • Hours_Worked

然后你可以得出结论是否缺少一个值(其中一个时间字段是 NULL )并且可以快速查询表格中的工作小时数(或每周一次)使用Work_Day作为计算的根目录添加快速列。

要回答原始问题,伪代码会是这样的:

// $query = mysql_query(....) // <-- populate this
$times = Array('start'=>null,'end'=>null);
$result = Array('start_time'=>null,'end_time'=>null,'total_wo_lunch'=>0,'total_w_lunch'=>0);
while ($log = mysql_fetch_array($query)){
{      
  $_ = $log['date'].' '.$log['time'].':00';
  $_datetime = strtotime($_);

  if (is_null($result['start_time'])) $result['start_time'] = $_datetime;
  else $result['end_time'] = $_datetime;

  if (is_null($times['start'])) $times['start'] = $_datetime;
  else if (is_null($times['end'])) {
    $times['end'] = $_datetime;

    $diff = ($times['end']-$times['start'])/3600; // convert to hours

    $result['total_wo_lunch'] += $diff;

    $times['start'] = null;
    $times['end'] = null;
  }
}
$result['total_w_lunch'] = ($result['end_time']-$result['start_time'])/3600; // convert to hours

print_r($result);

<强> EDITv2

这是一个有效的代码更新。我唯一的问题是在时间卡上有一点点(8.5小时工作时间是8.53,虽然我不明白为什么。与整个9.5小时的一天相同)。除此之外它似乎工作正常。如果您想看到其他更改,请告诉我,并且对于发布未经测试的代码表示歉意。我或多或少是出于概念。