Как рассчитать общее рабочее время, если время входа в систему больше одного в таблице - PullRequest
0 голосов
/ 20 сентября 2018

Я использую CodeIgniter.Я вычисляю общее количество рабочих часов за день.

Итак, что я делаю, когда пользователь входит в систему, он вставит время входа в таблицу, и статус is_active будет 1.Примерно так:

enter image description here

Если пользователь выйдет из системы, он обновит время выхода из системы, и статус is_active будет 0.

enter image description here

При повторном входе того же пользователя будет добавлено новое время входа enter image description here

Тот же процесс для выхода из системы,Я могу рассчитать время между двумя датами, но в моем сценарии пользователь может войти в систему несколько раз.

Я отображаю список записей, которые 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?

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

Я обычно вычисляю время после извлечения данных из базы данных.

<?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']);
}
0 голосов
/ 20 сентября 2018

Вы получите время в секундах и сможете конвертировать в ваш формат.

select sum(TIMESTAMPDIFF(SECOND,login_time,logout_time)) from table_name group by date(login_time),id;
0 голосов
/ 20 сентября 2018

MySQL поддерживает TIMESTAMPDIFF:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...