2

したがって、次のようなMySQLテーブルがあります。

id        timestamp                action        timePassed

1         2012-07-10 22:44:00      start         0
2         2012-07-10 22:44:50      pause         50
3         2012-07-10 22:45:30      play          50
4         2012-07-10 22:47:25      pause         205
5         2012-07-10 22:48:05      play          205

それがどれほど明白かはわかりませんが、ここで起こっていることは基本的にすべての「一時停止」行で、現在のタイムスタンプと「開始」行のタイムスタンプの差を秒単位で計算しています。

これを行う唯一の方法は、データベースに新しい「一時停止」行を挿入して、タイムスタンプが生成されるようにすることです...次に、その「一時停止」行のタイムスタンプをデータベースに照会します...差を秒単位で計算しますPHPを使用して、その「一時停止」行と「開始」行の間...次に、timePassedの結果で「一時停止」行を更新します。

私の質問は、これを行うためのより良い方法があるかどうかです (つまり、timediff または他の MySQL コマンドを使用します)。問題は、INSERT を実行するまで「一時停止」タイムスタンプが存在しないことです。そのため、計算を行う前に最初にそれを行う必要があると思いますか?

4

3 に答える 3

0

これを行う唯一の方法は、データベースに新しい「一時停止」行を挿入して、タイムスタンプが生成されるようにすることです...次に、その「一時停止」行のタイムスタンプをデータベースに照会します...差を秒単位で計算しますPHPを使用して、その「一時停止」行と「開始」行の間...次に、timePassedの結果で「一時停止」行を更新します。

すでに計算された行を INSERT できます。

INSERT INTO table (timestamp, action, timePassed)
    SELECT now(), 'pause', SECOND(timediff(now(), timestamp))
    FROM table
    WHERE action = 'start'; -- and/or other WHERE clauses.

これにより、「開始」行を取得するのに必要な時間が原因で時間のずれが発生します (ただし、アクションのインデックス (および行が非常に大きい場合はタイムスタンプ) がある場合、その時間は無視できるはずです)。

于 2012-07-10T13:18:30.820 に答える
0

あなたのテーブルがこのようなものであり、あなたの要件がこのようなものであれば、順調に進んでいます..

ただし、最後の行と最後から最後の行の 2 番目の違いを確認するとよいでしょう。これにより、ユーザーがトラックを一時停止または再生した秒数がわかります。

INSERT INTO table (timestamp, action, timePassed)
    SELECT now(), 'pause', SECOND(timediff(now(), timestamp))
    FROM table
    WHERE ID = (Select Max(ID) from Table)

2人の時間差を挿入できるように、アクションを好きなように入れます。

于 2012-07-10T13:22:16.020 に答える
0

timePassed各イベントのタイムスタンプを持つことで、すべての間隔が一度保存されるため、明示的に保存しないことをお勧めします。を別々timePassedに保存すると、同じデータを複数の場所に保存することになります。EF Codd の言葉を引用すると、「何かが真実なら、それを 2 回言ってもそれ以上真実にはなりません。」また、同じものを複数回保存すると、異常が更新される可能性があります。

クエリで間隔を計算したい場合は、これでうまくいくかもしれません。

SELECT event.id,
       event.timestamp,
       event.action,
       TIME_TO_SEC(TIMEDIFF(event.timestamp, start_event.timestamp)) time_passed
  FROM event
  JOIN (SELECT timestamp
          FROM event
         WHERE event.action = 'start') start_event ON 1 = 1
于 2012-07-10T13:37:03.897 に答える