如果登录时间超过表中的一个小时,如何计算总工作时间

cnh2zyt3  于 2021-06-19  发布在  Mysql
关注(0)|答案(3)|浏览(261)

我正在使用codeigniter。我在计算一天的总工作时间。
所以我要做的是,当用户登录系统时,它会在表中插入登录时间,然后 is_active 状态将 1 . 像这样的

如果用户注销,那么它将更新注销时间和 is_active 状态将 0 .

如果同一个用户再次登录,那么它将插入新的登录时间

注销的过程相同。我可以计算两个日期之间的时间,但是在我的场景中,用户可以多次登录。
我正在显示记录的列表 is_active 状态为1。
模型

public function get_current_login(){
        $this->db->select('*');
        $this->db->from('tbl_employee');
        $this->db->join('tbl_current_login','tbl_current_login.emp_id=tbl_employee.id');
        //$this->db->where($where);
        $this->db->where('is_active',1);
        $query = $this->db->get();
        $result = $query->result(); 
          if($result)
          {
            return $result;
          }
          else 
          {
            return 0;
          }
    }

上面的代码将显示用户列表,其中 is_active 状态为1。(我尚未共享视图和控制器代码)。
现在我要计算一天的总工作时间。我是否在正确的路径上插入和更新登录和注销时间?是可以用mysql计算还是必须用php?

cwxwcias

cwxwcias1#

mysql支持时间戳:
https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html
您可以使用它来给出两个日期时间之间的小时数或小数小时数
如果你想得到一个合理精确的小时数,你可以要求两次之间的秒数,并将结果除以3600
如果您正在编写报告,计算员工每周或每月工作的小时数,请按员工和周/月分组,并将小时数相加。使用year()函数和month()或week()函数将日期缩减为周或月
例子:

SELECT emp_id, year(login_time), month(login_time), sum(timestampdiff(second, login_time, logout_time)/3600.0)
FROM timeclock
WHERE logout_time > ‘0000-00-00’
GROUP BY 
  employee_id, year(login_time), month(login_time)

如果你想要每周的报告,就用周代替月
以下是一份报告,给出了每个日期的登录和注销时间以及当天的工作时间:

SELECT emp_id, year(login_time), month(login_time), day(login_time), min(login_time), max(logout_time), sum(timestampdiff(second, login_time, logout_time)/3600.0)
FROM timeclock
WHERE logout_time > ‘0000-00-00’
GROUP BY 
  employee_id, year(login_time), month(login_time), day(login_time)
xmq68pz9

xmq68pz92#

你将得到秒的时间,可以转换成你的格式。

select sum(TIMESTAMPDIFF(SECOND,login_time,logout_time)) from table_name group by date(login_time),id;
mzsu5hc0

mzsu5hc03#

我通常计算从数据库获取数据后的时间。

<?php

// Let's assume the $result is the database records result

$current_date = date('Y-m-d H:i:s');

$total_duration = 0;
foreach ($result as $row)
{
    // Set logout date as current date if user still logged in
    if ($row['logout_time'] === '0000-00-00 00:00:00') $row['logout_time'] = $current_date;
    // You may need to group the total duration based on employee id
    $total_duration += strtotime($row['logout_time']) - strtotime($row['login_time']);
}

相关问题