【问题标题】:MySQL - Finding time difference between rows for different Id'sMySQL - 查找不同 ID 的行之间的时间差
【发布时间】:2018-05-28 09:13:03
【问题描述】:

我有一个包含以下数据的表格:

ID   status-before             status-current         DATE-timestamp         
5    Un-Assigned                Assigned              2013-12-17 14:14:04
5    Assigned                   Completed             2013-12-21 14:14:04
7    Un-Assigned                Assigned              2014-01-02 14:14:04 
7    Assigned                   Completed             2014-01-21 14:14:04
7    Completed                  Locked                2014-01-21 14:14:04
8    Un-Assigned                Assigned              2014-12-21 14:14:04
8    Assigned                   Completed             2014-12-27 14:14:04

我使用 group by 对 id 和排序的时间戳字段进行分组。我不知道如何使用 rownum(或任何其他方法)来计算仅具有相同 id 的行的时间差。

我希望我的最终输出如下

ID   status-before              status-current     DATE-timestamp       Time Diff(Hours)
5    Un-Assigned                Assigned        2013-12-17 14:14:04    xx
5    Assigned                   Completed       2013-12-21 14:14:04    xx
7    Un-Assigned                Assigned        2014-01-02 14:14:04    xx 
7    Assigned                   Completed       2014-01-21 14:14:04    xx
7    Completed                  Locked          2014-01-21 14:14:04    xx
8    Un_Assigned                Assigned        2014-12-21 14:14:04    xx
8    Assigned                   Completed       2014-12-27 14:14:04    xx

【问题讨论】:

  • 为什么两个status_after,和final output没有意义。
  • 你能手动写出 ID = 7 的三行的 'xx' 应该是什么吗?
  • 不知道xx 应该是什么,您的问题不清楚。如果每个 id 只有两行,为什么不只创建一个每个 id 一行的结果集?
  • 为什么你的表有相同的列 status-after 名称?

标签: mysql sql


【解决方案1】:

使用TIMEDIFF返回hours:minutes:secondsDATEDIFF返回days

SELECT TIMEDIFF('complete.TIMESTAMP','assign.TIMESTAMP');
SELECT DATEDIFF('complete.TIMESTAMP','assign.TIMESTAMP');

【讨论】:

    【解决方案2】:

    如果您对 Assigned 和 Completed 之间的时间差感兴趣,可以使用下面的脚本。

    SELECT a.ID, 
       b.[status-after], 
       a.[DATE-timestamp], 
       DATEDIFF(Hour, a.[DATE-timestamp], b.[DATE-timestamp]) AS TimeDiff_Hours
    FROM YourTable a
    JOIN YourTable b 
    ON a.ID = b.ID AND b.[status-after] = 'Completed'
    WHERE a.[status-after] = 'Assigned'
    

    【讨论】:

      【解决方案3】:

      大概,您希望时间差异到 id 的 next 状态。让我假设 MySQL 版本 8 之前。您可以使用相关子查询获取下一个时间戳,然后使用 timestampdiff()

      select t.*,
             timestampdiff(hour, date_timestamp, next_datetimestamp) as diff_hours
      from (select t.*,
                   (select t2.date_timestamp
                    from t t2
                    where t2.id = t.id and
                          t2.date_timestamp > t.date_timestamp
                    order by t2.date_timestamp asc
                   ) as next_date_timestamp
            from t
           ) t;
      

      如果您使用的是 MySQL 8.0,则可以使用 lead() 函数简化此逻辑。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-31
        • 2015-03-06
        相关资源
        最近更新 更多