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)。したがって、これはボブが 1 時間働いたことを示していますが、実際には、ボブは 24 ~ 48 時間の時間枠内で合計 8 時間働いていました。(row1 から 6 時間 + row2 から 1 時間 + row3 から 1 時間)

だから今、私はちょっと立ち往生しています。

これを行うにはもっと簡単な方法が必要だと思います。認証データベースの設計がうまくいかないか、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 に答える