所有员工输入/输出数据输入都采用以下格式:
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'
答案 0 :(得分:1)
我已经考虑过了,我没有看到这样做的方法,没有迭代每个项目并自己进行计算。您可以添加“日期”列(例如DAYOFMONTH
,DAYOFWEEK
或DAYOFYEAR
),然后按“时间”升序开始浏览登录/退出时间。唯一的问题是“开放式”时间(用户没有进/出的情况)。
我见过的大多数时间表都使用(通常)4列消除了这一点。
然后你可以得出结论是否缺少一个值(其中一个时间字段是 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小时的一天相同)。除此之外它似乎工作正常。如果您想看到其他更改,请告诉我,并且对于发布未经测试的代码表示歉意。我或多或少是出于概念。