答案 0 :(得分:0)
绝对在PHP中进行计算 - 不要试图单独使用SQL。您无法在SQL中处理异常/无效输入。
注意:对于这个答案,我假设每个员工在工作日期都有2个条目(例如没有午休时间)以及工作时间在同一天开始和结束。
我会创建一个简单的php函数,它返回1名员工1天的工作时间,例如
/**
* @param int $emp_id Numeric employee ID, e.g. 156
* @param string $date The date as 10 character string e.g. "2017-03-16"
* @return int The working time, in seconds. e.g. 8 hours = 28800 seconds.
*/
function get_working_hours( $emp_id, $date ) {}
然后从SQL DB中检索该员工的时间,例如
$sql = sprintf(
"SELECT punch_date FROM `%s` WHERE emp_id = %d AND punch_date LIKE '%s %%'",
'table_name',
(int) $emp_id,
mysqli_real_escape_string( substr( $date, 0, 10 ) )
);
// Result SQL looks like:
// SELECT punch_date FROM `table` WHERE emp_id = 156 AND punch_date LIKE '2017-03-16 %'
接下来运行SQL并检查,如果你有2个结果。
// Get the results from DB, I assume you use mysqli:
$result = mysqli_query( $db_link, $sql );
if ( mysqli_num_rows( $result ) != 2 ) {
// either invalid punches (too many or only 1), or not punched at all.
return 0;
}
最后你有两个打卡日期。现在计算差异很简单:
$item1 = mysqli_fetch_row( $result );
$item2 = mysqli_fetch_row( $result );
// Convert the date string to a numeric timestamp:
$time1 = strtotime( $item1[0] );
$time2 = strtotime( $item2[0] );
// Calculate and return the difference:
return abs( $time1 - time2 ); // Return value is the working time in SECONDS!
本例中缺少一些部分,主要是数据库连接和一些卫生设施(例如输入参数是否正确?两者都是SQL返回值正确的时间字符串?...)
答案 1 :(得分:0)
假设一名员工每天只进行两次打入/关闭,您可以使用GROUP BY
TIMEDIFF
和DATE
函数来计算一天的工作时间,例如:
SELECT empid, DATE(punch_date) as date, TIMEDIFF(MAX(punch_date), MIN(punch_date)) as hours
FROM records
GROUP BY empid, DATE(punch_date);
这是 SQL Fiddle 。