如何在同一天找到同一列的两个日期之间的差异?

时间:2017-04-23 08:51:00

标签: php mysql

我有一张名为出勤的表,其中包括员工记录。 enter image description here

我想要做的是找到日期之间的差异,或者我想找到员工当天的工作时间.. 我正在使用Php和Mysql数据库。 任何人都可以帮助我吗?

2 个答案:

答案 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 TIMEDIFFDATE函数来计算一天的工作时间,例如:

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