Php 如何使用日期和日期获取总工作时数;MYSQL中关于签入的时间&;第二天结账时间

Php 如何使用日期和日期获取总工作时数;MYSQL中关于签入的时间&;第二天结账时间,php,mysql,Php,Mysql,下表显示了员工的签入和签出时间 员工ID报告日期报告时间 11 2014-12-01 08:02:31 21 2014-12-01 08:13:04 06 2014-12-01 08:13:04 11 2014-12-02 18:03:41 21 2014-12-02 16:36:02 06 2014-12-03 16:36:02 11 2014-12-04 08:02:31 06 2014-12-04 08:36:

下表显示了员工的签入和签出时间

员工ID报告日期报告时间

 11     2014-12-01 08:02:31
 21     2014-12-01 08:13:04
 06     2014-12-01 08:13:04
 11     2014-12-02 18:03:41
 21     2014-12-02 16:36:02
 06     2014-12-03 16:36:02
 11     2014-12-04 08:02:31
 06     2014-12-04 08:36:02
 21     2014-12-02 08:36:02
 11     2014-12-04 16:34:20
 06     2014-12-05 08:36:02
 21     2014-12-05 08:50:50

工作时间的算法是什么? 假设工作时间等于签出时间减去签入时间,我得到以下SQL:

SELECT 
  Emp_id,
  report_date,
  MIN(report_time) AS checkin_time,
  MAX(report_time) AS checkout_time,
  DATE_FORMAT (MAX(report_time) - MIN(report_time), '%h') AS working_hours
FROM
  report 
GROUP BY Emp_id;
但是,当员工一次又一次地去上班时,情况就糟透了


我在想为什么员工第二天就要结账。当我看到06号员工在两天后退房时,我也很困惑。囧

对于夜班,我尝试了以下SQL,可能会有所帮助:

SELECT 
  a.`id` AS employ_id,
  ADDTIME(MIN(a.adjustedDateTime), '12:00:00') AS check_in_time,
  ADDTIME(MAX(a.adjustedDateTime), '12:00:00') AS check_out_time,
  TIMEDIFF(
    MAX(a.adjustedDateTime),
    MIN(a.adjustedDateTime)
  ) AS working_time,
  COUNT(0) AS report_times,
  DATE_FORMAT(a.adjustedDateTime, '%Y-%m-%d') AS report_date
FROM
  (SELECT 
    `Emp_id` AS id,
    SUBTIME(
      CONCAT(report_date, ' ', report_time),
      '12:00:00'
    ) AS adjustedDateTime 
  FROM
    report) a 
GROUP BY a.`id`,
  DATE_FORMAT(a.adjustedDateTime, '%Y-%m-%d') 
ORDER BY a.`id`, report_date;
我使用
子时间
将一个班次的报告时间汇总为一天。然后按日期分组。因此得到了结果。

我有一个查询:-

<?php
require_once('dbconn.php');
$q="select employee_oid, min(concat(report_date,' ',report_time)) as checkin, max(concat(report_date,' ',report_time)) as checkout from report_master where 1 group by employee_oid,report_date;";
$rec = mysql_query($q);
$k=0;
$i=0;
$previous_empid=0;
if(mysql_num_rows($rec) > 0)
{ 
$arr=$arr2 = array();

while($row = mysql_fetch_array($rec))

{
$employee_oid = $row['employee_oid'];
$minmumdate = $row['checkin'];
$maxdate = $row['checkout'];
$timestamp1 = strtotime($minmumdate);
$timestamp2 = strtotime($maxdate);
$hour = abs($timestamp2 - $timestamp1)/(60*60);

$arr[$employee_oid][] = array(
'hours'=>$hour
);

}
        //print_r($arr);
foreach($arr as $key=>$result){
//echo $key.'   key value';
$total_hours=0;
foreach($result as $key1=>$result1){
$total_hours= $total_hours + $result1['hours'];
}
if($total_hours>176) {
    $extra_hours = $total_hours - 176;
    $extra_wages = $extra_hours * 31.25;
                }
$arr2[$key][] = array(
    'total_hours'=>$total_hours,
    'extra_hours'=>$extra_hours,
    'extra_wages' =>$extra_wages
    );

}

print("<pre>");
print_r($arr2);
exit();
foreach($arr2 as  $key=>$result){
echo $key.' = > total_hours '.$result['total_hours'].' extra_hours '.$result['extra_hours'].' extra_wages '.$result['extra_wages'].'</br></br>';
            }
    }

?>
yb_date
roll
staff_name
status
in_time
out_time
duration
29
2
asd
H
00:00:00
00:00:00
00:00:00
30
2
asd
A
00:00:00
00:00:00
00:00:00
01
2
asd
A
00:00:00
00:00:00
00:00:00
02
2
asd
P
17:10:03
17:10:03
00:00:00
03
2
asd
P
15:10:03
15:10:03
00:00:00
04
2
asd
P
06:10:03
18:10:03
12:00:00
05
2
asd
H
00:00:00
00:00:00
00:00:00

如果我加上夜班意味着如何获得

我们如何准确确定入住和退房时间?您只有三列,分别显示两次适用于三名员工的日期和时间。@mike我正在从thumb reader的文本文件中提取数据。因为没有基于日期的最小签入时间和日期的最大签出时间的单独签入和签出字段。同一名员工需要有一个开始时间和结束时间,以便计算小时差。如果没有正确定义这些信息,我认为我们无法提供答案。请尝试转换您提供的表,以便有一列表示签入时间和一列表示签出时间。我相信无法修改该表,因为他是从thumb reader获得该表的。它没有定义签入或签出。可能唯一真正的参考是假设用户的第一条记录是他正在签入,然后从那里进行所有引用的计算。该查询不只是返回员工第一次签入和最后一次签入之间的时间差吗?如果你每次工作都需要一份报告会怎么样?如果一名员工在一年内登记入住和退房,你只会得到第一次和最后一次之间的差异,而不考虑这两者之间的所有差异。你会有一年的时差@克拉伦斯如果我接受这个查询,工作时间将是null@helloworld,这个问题很不清楚。我只是想扔出一条小鱼去抓一条鲸鱼。@Shivaraj patil,你能展示更多的数据并解释签入和签出时间的规律吗?我没有得到结果。@helloworld直到现在我尝试了这个代码,但仍然有问题。
yb_date
roll
staff_name
status
in_time
out_time
duration
29
2
asd
H
00:00:00
00:00:00
00:00:00
30
2
asd
A
00:00:00
00:00:00
00:00:00
01
2
asd
A
00:00:00
00:00:00
00:00:00
02
2
asd
P
17:10:03
17:10:03
00:00:00
03
2
asd
P
15:10:03
15:10:03
00:00:00
04
2
asd
P
06:10:03
18:10:03
12:00:00
05
2
asd
H
00:00:00
00:00:00
00:00:00