mysql - 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
解决方案
我认为最简单的方法是转换为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
推荐阅读
- javascript - Onclick only works on second click. How to get it to work on first click
- input - 如何设置 Yii2 ajaxCrud modal 的 activeform 输入字段自动对焦
- dataframe - 如何在 pyspark 数据框中拆分数字并添加连字符?
- selenium - 如何使用 SendKeys Selenium 上传多个文件
- ruby-on-rails - 为什么 Rails 缓存过期不起作用?
- amazon-web-services - EC2 服务器实例上的 Amazon ECS 命中 RESOURCE:ENI 错误
- npm - Gitlab NPM 注册表安装 503
- node.js - 如何从 Firebase 托管重写发送的请求中获取 Cloud Run 服务器上的主机名?
- pine-script - Add trendline at 0000 NY on open candle
- javascript - 如何从 GitHub API 获取数据