【问题标题】:MySQL: Substract Timestamp for Different IDsMySQL:减去不同 ID 的时间戳
【发布时间】:2023-03-25 16:44:01
【问题描述】:

假设我有一个带有 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        |

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

我在子查询中尝试了 TIMESTAMPDIFF,我尝试减去两个查询。当然有很多不同的ID,但是结构和发布的完全一样

【问题讨论】:

  • timestamp 列的数据类型是什么?是DATE吗?
  • 直接是时间戳。我也尝试过转换它。但它失败了,我试图计算每个 ID 的差异

标签: mysql sql date timestamp


【解决方案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】:

    在您的设计中,您没有足够的数据来进行计算。例如。如果a1这本书再次发行,你只需插入另一个事件3,这会造成混乱,比如事件1、2和3哪个是问题事件,哪个是返回事件。

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

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

    例如

    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
    

    【讨论】:

    • 我最大的问题是,我不知道我的表的结构是怎样的,我们在学校得到了一个带有一些解释的 csv,必须找到解决这个问题的方法。我能够回答 9/10 的问题,但这让我发疯了
    • 在这种情况下,@ypercube 的解决方案应该适合您。我的答案是针对现实世界的场景。
    【解决方案3】:

    您可以使用这样的查询:

    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
    

    【讨论】:

      猜你喜欢
      • 2011-04-02
      • 2014-04-25
      • 2021-04-14
      • 1970-01-01
      • 1970-01-01
      • 2016-10-17
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多