我正在使用CodeIgniter,并且正在根据日期计算总时间。
说明:
我正在做的是,每次登录时,我都会使用以下代码在数据库中插入last_Ativity日期和时间。
$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);
如果用户仍在系统中,则last_activity时间将持续更新。 (我正在使用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进行计算?我需要一些主意。 你能帮我这个忙吗?
答案 0 :(得分:0)
这就是我要做的
如果用户仍在系统中,则last_activity时间将持续更新。 (我正在使用Ajax更新日期时间。我没有共享该代码。)
在更新行之前。
对于时间戳,您将进行选择以获取当前行。在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
如果您只处理数据库中的两个日期时间字段,则更容易获得它们之间的差异,但是感觉到您已经有代码不断更新最后一个活动字段,从长远来看,这将需要较少的工作海事组织。
选项2
另一种选择是添加另一个“日期时间”字段以输入开始时间或登录时间。然后,当您查询时,可以将它们转换为它们的时间戳,然后减去以得到差值。
这使SQL变得更难(在执行SUM时),我真的无法想到如何计算多行的经过时间,然后将其汇总。但这确实简化了PHP。因此,哪种方法最适合您的需求。考虑一下,如果您需要该实用程序知道他们何时登录,还是只想以一种更简单的方式来计算他们花费的时间。
类似的东西。
答案 1 :(得分:0)
假设唯一的日志是根据用户操作而发生的,因此,例如,在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条件时,我们带来了边缘情况:first或last
然后剩下的只是计算两个表之间的分钟数
由于我假设没有注销记录发生,因此我处理了第一次和最后一次登录相同或没有最后一次登录的情况