首页 > 解决方案 > mysql中每行的日期差异

问题描述

我想为每个日期时间行获得以秒为单位的差异。我怎样才能在mysql中实现这一点?

id record
1 2019-02-12 19:59:44
2 2019-02-12 20:00:27
3 2019-02-12 20:01:10

期望的输出:

id record               difference in seconds
1  2019-02-12 19:59:44  0
2  2019-02-12 20:00:27  43
3  2019-02-12 20:01:10  44

标签: mysqlmysql-8.0

解决方案


我认为最简单的方法是转换为UNIX_TIMESTAMP()可以直接计算的a。

您可以直接在当前记录和LAG()类似记录之间进行计算。

column - LAG(column) OVER()
column + LAG(column) OVER()

询问

SELECT 
   t.id
 , t.record
 , (
     CASE 
       WHEN 
          UNIX_TIMESTAMP(t.record) - UNIX_TIMESTAMP(LAG(t.record) OVER(ORDER BY t.record ASC)) IS NOT NULL 
       THEN 
          UNIX_TIMESTAMP(t.record) - UNIX_TIMESTAMP(LAG(t.record) OVER(ORDER BY t.record ASC))
       ELSE 0
     END
   ) AS difference_in_seconds                                                                      
FROM 
 t
ORDER BY 
  t.id ASC

结果

| id  | record              | difference_in_seconds |
| --- | ------------------- | --------------------- |
| 1   | 2019-02-12 19:59:44 | 0                     |
| 2   | 2019-02-12 20:00:27 | 43                    |
| 3   | 2019-02-12 20:01:10 | 43                    |

演示

为什么要在 CASE 表达式中重复自己?使用 COALESCE

的确

COALESCE(
       UNIX_TIMESTAMP(t.record) - UNIX_TIMESTAMP(LAG(t.record) OVER(ORDER BY t.record ASC))
     , 0                                                                  
   ) AS difference_in_seconds  

与使用相同

 (
     CASE 
       WHEN 
          UNIX_TIMESTAMP(t.record) - UNIX_TIMESTAMP(LAG(t.record) OVER(ORDER BY t.record ASC)) IS NOT NULL 
       THEN 
          UNIX_TIMESTAMP(t.record) - UNIX_TIMESTAMP(LAG(t.record) OVER(ORDER BY t.record ASC))
       ELSE 0
     END
   ) AS difference_in_seconds     

推荐阅读