0

我有一个在 mysql 中格式化的简单身份验证日志,如下所示:


用户名 | 登录时间 | 最后登录

鲍勃 | 2012-01-01 22:00:00 | 2012-01-02 06:00:00

鲍勃 | 2012-01-02 08:00:00 | 2012-01-02 09:00:00

鲍勃 | 2012-01-02 23:00:00 | 2012-01-03 10:00:00


现在,我正在尝试显示用户在这些时间范围内工作的总小时数:

0-24小时前

24-48 小时前

48-72 小时前


对于 24-48 示例,我最初编码:

$start_time = date("Y-m-d H:i:s", strtotime("-2 days"));
$end_time = date("Y-m-d H:i:s", strtotime("-1 days"));
$result_time = mysql_query("SELECT login_time,last_active FROM `auth_log` WHERE username = '".$row['username']."' AND login_time > '$start_time' AND login_time <= '$end_time' AND authenticated = 'yes'");
    while($row_time = mysql_fetch_array( $result_time )) {
        $time = strtotime($row_time['last_active']) - strtotime($row_time['login_time']);
        $tot_time = $tot_time + $time;
    }
$total_time = gmdate('H:i',$tot_time);

如果我们的 24-48 小时时间截止时间是:2012-01-02 00:00:00 和 2012-01-03 00:00:00,那么如上面的数据库表所示,第 1 行和第 3 行将不包含在查询。只有在截止时间内的记录才会显示(第 2 行)。因此,这将表明 Bob 工作了 1 小时,而实际上 Bob 在 24-48 小时的时间范围内总共工作了 8 小时。(从第 1 行开始 6 小时 + 1 小时第 2 行 + 1 小时第 3 行)

所以现在我有点卡住了。

我认为必须有一种更简单的方法来做到这一点。要么我的身份验证数据库设计很糟糕,要么有一种更简单的方法可以使用 mysql 时间/日期查询来获取此信息,否则我将不得不进行非常复杂的查找,例如:

$start_time = date("Y-m-d H:i:s", strtotime("-2 days"));
$end_time = date("Y-m-d H:i:s", strtotime("-1 days"));
$result_time = mysql_query("
SELECT login_time,last_active FROM auth_log 
WHERE username = '$username' 
AND authenticated = 'yes'
AND (login_time >= '$start' AND last_active <= '$end') 
OR (login_time >= '$start' AND login_time <= '$end' AND last_active > '$end') 
OR (last_active >= '$start' AND last_active <= '$end' AND login_time < '$start') 
");

任何帮助肯定会不胜感激!

4

1 回答 1

0
$day_index = SELECT WEEKDAY(\''.$date.'\') AS day_index;

SELECT SEC_TO_TIME( SUM( t.diff ) ) AS suma
FROM (
    SELECT login_time, TIME_TO_SEC( TIMEDIFF( logout_time, login_time ) ) AS diff
    FROM login_times
    WHERE user_id = '.$id.'
    AND DATE( login_time ) = SUBDATE(\''.$date.'\', '.$day_index.' )
) AS t
GROUP BY DATE( t.login_time )'

我有像你一样的表,这个查询正确地处理了选择,只是代替了我的名字user_id

于 2012-09-11T10:45:19.577 回答