MySQL:为不同的ID减去时间戳

时间:2013-06-11 20:11:28

标签: mysql sql date timestamp

假设我有一个带有ID,时间戳和事件的表。

例如:我有一张ID为1的书,另一张ID为2的书。两张都是在特定时间戳上借出的,在表格中由事件1标记。

然后两个都与事件2一起返回。那么我怎样才能找出每本书的借阅期?我找不到答案,我变得疯狂了!

ID   |   Timestamp   |   Event
-------------------------------
a1   |  2013-10-23   |    1
a2   |  2013-10-23   |    1
a1   |  2013-10-25   |    2
a2   |  2013-10-26   |    2

结果

ID   |   Days lent   |
-----------------------
a1   |      2        | 
a2   |      3        |

我没有更好的解释,抱歉。我试过的每个子查询都会导致“多行”错误。

我在subquerys中尝试了TIMESTAMPDIFF,我试图减去两个查询。当然有许多不同的ID,但结构与发布完全相同

3 个答案:

答案 0 :(得分:1)

在您的设计中,您没有足够的数据来进行计算。例如。如果再次发布了本书a1,您只需插入另一个事件3,这会产生混淆,例如事件1,2和3中的哪一个是问题事件,哪些是返回事件。< / p>

为了解决这个问题,我提出以下建议。

对发布/返回事件对使用相同的事件ID。 添加新指标以显示哪种记录,发布或返回。

E.g。

ID   |   Timestamp   |   Event | Type
---------------------------------------
a1   |  2013-10-23   |    1    | Issue
a2   |  2013-10-23   |    1    | Issue
a1   |  2013-10-25   |    1    | Return
a1   |  2013-10-26   |    1    | Return

所以在这种情况下,查询将是

Select Book.ID, (Return_T.return_date - Issue_T.issue_date) duration
from 
(Select ID, Timestamp issue_date from Book where Type='Issue') Issue_T,
(Select ID, Timestamp return_date from Book where Type='Return') Return_T,
Book
where Book.ID = Issue_T.ID
and Issue_T.ID = Return_T.ID

答案 1 :(得分:1)

SELECT 
    s.id,   
    DATEDIFF(e.timestamp, s.timestamp) AS Days_lent
FROM 
    schedule AS s          -- start
  JOIN
    schedule AS e          -- end
      ON  s.id = e.id
      AND s.timestamp < e.timestamp 
WHERE
    s.event = 1
  AND
    e.event = 2 ;

测试: SQL-Fiddle

答案 2 :(得分:0)

你可以使用这样的查询:

SELECT
  id,   
  DATEDIFF(
    MAX(CASE WHEN Event=2 THEN Timestamp END),
    MIN(CASE WHEN Event=1 THEN Timestamp END)) AS days_lent
FROM
  schedule
GROUP BY
  id