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

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

Объяснение:

Что я делаю, при каждом входе в систему я вставляю дату и время last_Activity в полебаза данных с использованием кода ниже.

$data_login= array('emp_id' =>$result->id ,'last_activity' =>date("Y-m-d H:i:s", STRTOTIME(date('h:i:sa'))));
$this->db->insert('tbl_current_login',$data_login);

Время последней активности постоянно обновляется, если пользователь все еще находится в системе.(Я использую ajax для обновления даты и времени. Я не поделился этим кодом).

Теперь мне нужно вычислить общее время конкретного пользователя для одного дня (текущая дата).

Например - emp_id 26 вошел в систему дважды, поэтому мне нужно вычислить время

First-time login date and time:-2018-09-17 07:27:55
Second-time login date and time:- 2018-09-17 07:35:22

Оно будет увеличиваться в зависимости от того, сколько раз пользователь вошел в систему.

Я запуталсяо времени.Я на правильном пути, чтобы рассчитать общий час входа в систему?Должен ли я использовать запрос MYSQL или PHP для расчета?Мне нужна идеяНе могли бы вы помочь мне в этом?

enter image description here

Ответы [ 2 ]

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

Предполагается, что единственный журнал происходит на основе действий пользователя, и поэтому через 15 минут (например) пользователь считается отключенным И при условии, что вы захотите общее количество в день, решение должно быть примерно таким:

    SELECT
     first.emp_id, 
     SUM(TIMESTAMPDIFF(MINUTE,first.last_acivity, DATE_ADD(IFNULL(last.last_acivity, first.last_acivity), INTERVAL 15 MINUTE))) as logged_minutes

FROM

(
SELECT
 la1.*
    FROM
    last_acivity la1
    LEFT JOIN last_acivity la2 ON
    la1.emp_id = la2.emp_id AND la1.last_acivity < la2.last_acivity
    AND la2.activity =< @date0
    WHERE
     la1.last_acivity >= @date0
  AND la2.login_id IS NULL
) first

LEFT JOIN

(
SELECT
 la1.*
    FROM
    last_acivity la1
    LEFT JOIN last_acivity la2 ON
    la1.emp_id = la2.emp_id AND la1.last_acivity > la2.last_acivity
    AND la2.activity =< @date0
    WHERE
     la1.last_acivity >= @date0
  AND la2.login_id IS NULL
) last 
ON
first.emp_id = last.emp_id

    GROUP BY
     emp_id

В этом запросе нужно отдельно установить дату:

SET @date0  = DATE(NOW()) ;

Чтобы получить первую запись дня или последнюю, нам нужно ЛЕВО присоединить таблицу к себе на том же emp_id, НО с неравенством, которое получит для каждой записи emp своих предков или предшественников. Когда мы добавляем условие NULL, мы переносим граничный случай: первый или последний

Осталось только подсчитать минуты между двумя таблицами

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

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

Это то, что я бы сделал

Время последней активности постоянно обновляется, если пользователь все еще находится в системе. (Я использую ajax для обновления даты и времени. Я не поделился этим кодом).

Перед обновлением строки.

  • проверить, существует ли строка для активности
    • если это так, получите временные метки для даты и вычтите текущее время (то, на которое вы изменяете last_activity, из того, которое хранится в БД), возьмите это число и добавьте его к целочисленному столбцу с именем, например, прошедшее время. (вам нужно добавить это в БД)
    • если нет, то введите строку с 0 прошедшим временем (в зависимости от того, как вы вставили первую строку, возможно, при входе в систему), это может никогда не быть проблемой.

Для отметок времени вы должны сделать выбор, чтобы получить текущую строку. Возьмите поле datetime и используйте либо

 $time = strtotime($row['last_activity']);

OR

 $time = (new DateTime($row['last_activity']))->getTimestamp();

Затем вы просто делаете то же самое до даты, на которую собираетесь заменить это, и затем вычитаете, чтобы получить разницу в секундах.

$elapsed = time() - $time;

А затем добавьте это к текущему значению строк и сохраните его. Таким образом, вы можете отслеживать промежуточный итог в секундах времени, которое они проводят во время этого сеанса.

Тогда, когда вам нужно посчитать общее время, это просто сделать

SELECT SUM(elapsed_time) FROM {table} WHERE DATE(last_Ativity) = :date

Если бы вы имели дело только с двумя полями даты-времени в БД, было бы легче просто получить разницу между ними, но в смысле, что у вас уже есть код для постоянного обновления последнего активного поля, это потребует меньше работы в долгосрочной перспективе. ИМО.

Option2

Другой вариант - добавить еще одно поле Datetime, чтобы указать время начала или время входа в систему. Затем при запросе вы можете преобразовать их в их временные метки и вычесть, чтобы получить разницу.

Это делает SQL сложнее (при выполнении SUM), я не могу придумать, как вычислить истекшее время для нескольких строк, а затем суммировать их. Но это немного упрощает PHP. Итак, какой из способов лучше всего подходит для того, что вам нужно. Подумайте, нужна ли вам утилита, чтобы узнать, когда они вошли в систему, или вам нужен более простой способ подсчета времени, которое они проводят.

Нечто подобное.

...