计算每2行的时间戳之间的时间

时间:2018-05-25 14:01:15

标签: php mysql datediff

我有下表,正如您在表格中看到的那样,每个休息时间用户都有BREAK OUT和BREAK IN条目,但我很难计算每次休息所花费的时间。 你们能帮忙吗? 感谢。

ID  Name      Action     Datetime
 2  John Doe  BREAK OUT  2018-05-24 09:00:41
 3  John Doe  BREAK IN   2018-05-24 09:10:45
 4  John Doe  BREAK OUT  2018-05-24 13:00:49
 5  John Doe  BREAK IN   2018-05-24 13:30:52
 6  John Doe  BREAK OUT  2018-05-24 15:30:56
 7  John Doe  BREAK IN   2018-05-24 15:40:59

3 个答案:

答案 0 :(得分:1)

好吧,既然你没有真正说出如何获得这些数据以及你想在哪里显示结果,这就是你如何得到你想要的东西:

function getDateDiff($breakOut, $breakIn) {
    $dateStart = new DateTime($breakOut);
    $dateEnd   = new DateTime($breakIn); 

    $dateDiff  = $dateStart->diff($dateEnd); 

    return $dateDiff->format("%H:%I:%S");
}

现在你只需要使用该函数并返回diff:

2   John Doe    BREAK OUT   2018-05-24 09:00:41
3   John Doe    BREAK IN    2018-05-24 09:10:45

var_dump(getDateDiff("2018-05-24 09:00:41", "2018-05-24 09:10:45")); // '00:10:04'

4   John Doe    BREAK OUT   2018-05-24 13:00:49
5   John Doe    BREAK IN    2018-05-24 13:30:52

var_dump(getDateDiff("2018-05-24 13:00:49", "2018-05-24 13:30:52")); // '00:30:03'

6   John Doe    BREAK OUT   2018-05-24 15:30:56
7   John Doe    BREAK IN    2018-05-24 15:40:59

var_dump(getDateDiff("2018-05-24 15:30:56", "2018-05-24 15:40:59")); // '00:10:03'

因此,如果你想在PHP循环中获得这些结果,也许你可以试试这个:

// your data array, I assume it looks like this since I have no info
$array(
    2 => array(
        "name" => "John Doe",
        "break" => "2018-05-24 09:00:41",
    ),
    3 => array(
        "name" => "John Doe",
        "break" => "2018-05-24 09:10:45",
    ),
    4 => array(
        "name" => "John Doe",
        "break" => "2018-05-24 13:00:49",
    ),
    5 => array(
        "name" => "John Doe",
        "break" => "2018-05-24 13:30:52",
    ),
    ...
); 

$array_break_time = array();
foreach ($array as $key => $data) {
    if ($key % 2 == 0) {
        if(isset($array[$key + 1])) {
            $array_break_time[] = getDateDiff($data["break"], $array[$key + 1]["break"])
        }
    }
}

输出结果为:

$array_break_time = array(
    0 => '00:10:04',
    1 => '00:30:03'
    ....
);

但是因为我没有更多细节,所以不知道你的情况是否合适!

答案 1 :(得分:0)

E.g:

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(Action VARCHAR(20) NOT NULL,dt DATETIME PRIMARY KEY);

INSERT INTO my_table VALUES
('BREAK OUT','2018-05-24 09:00:41'),
('BREAK IN','2018-05-24 09:10:45'),
('BREAK OUT','2018-05-24 13:00:49'),
('BREAK IN','2018-05-24 13:30:52'),
('BREAK OUT','2018-05-24 15:30:56'),
('BREAK IN','2018-05-24 15:40:59');

SELECT bi.dt
     , SEC_TO_TIME(TIME_TO_SEC(bi.dt)-TIME_TO_SEC(MAX(bo.dt)))x 
  FROM my_table bi 
  JOIN my_table bo 
    ON bo.dt <= bi.dt 
 WHERE bo.action = 'break out' 
   AND bi.action = 'break in' 
 GROUP 
    BY bi.dt;

+---------------------+----------+
| dt                  | x        |
+---------------------+----------+
| 2018-05-24 09:10:45 | 00:10:04 |
| 2018-05-24 13:30:52 | 00:30:03 |
| 2018-05-24 15:40:59 | 00:10:03 |
+---------------------+----------+

答案 2 :(得分:-1)

如果您想在MySQL中执行此操作,那么您可以使用这样的子查询。 1.将个人ID提供给您的员工,并将他们的姓名存储在不同的表中,其中员工ID是主键,并在该表中存储他们的个人详细信息。 2.在此表中只有员工ID,与日期一起突破和中断。 然后你可以使用这个查询并选择一个特定的员工来找出他们的休息时间。

select timediff((select breakout_time from table where employee_id = ? and date=?),(select breakin_time from table where employee_id = "same as above" and date="Same as above")) from dual;

欢迎编辑或更新。 希望这会有所帮助。