MySQL - 一行与当前行之间的时间差

时间:2012-07-10 13:15:04

标签: php mysql

所以我有一个类似于这样的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在'pause'行和'start'行之间的秒数差异...然后使用timePassed结果更新'pause'行。

我的问题是,是否有更好的方法(即使用timediff或其他一些MySQL命令)。问题是'暂停'时间戳在我进行INSERT之前不存在,所以我觉得在我进行任何计算之前需要先发生这种情况吗?

3 个答案:

答案 0 :(得分:0)

  

我能想到的唯一方法是插入一个新的“暂停”行   进入数据库,生成时间戳...然后查询   数据库中“暂停”行的时间戳...计算   'pause'行和'start'行之间的秒数差异   使用PHP ...然后使用timePassed结果更新'pause'行。

您可以插入已计算的行。

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

由于检索“开始”行所需的时间(但在操作时有索引(如果行非常大,可能是时间戳),这将引入时间偏差,该时间应该可以忽略不计)。

答案 1 :(得分:0)

如果您的表格是这样的,并且您的要求是这样的,那么您就在轨道上......

但是,如果检查最后一行与最后一行之间的第二个差异,则会更好。这将让您了解有多少第二个用户有PAUSED或Play the TRACK。

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

根据需要执行操作,以便在两者之间插入时差。

答案 2 :(得分:0)

我建议不要明确地存储timePassed,因为通过拥有每个事件的时间戳,您已经存储了每个间隔一次。如果您单独存储timePassed,则您将在多个位置存储相同的数据。引用E. F. Codd,"如果某些事情是真的,说两次并不能使它更加真实。"此外,当您多次存储相同的内容时,您将更新异常。

如果要使用查询计算间隔,可能会有效。

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