sql - 查找时间戳之间的间隙

标签 sql sql-server

表中有很多行。该表有一个日期列(包括日期和时间)

我希望能够循环遍历表格并找到两行之间的任何间隙,其中行之间的差异为 5 分钟。

例如:

ID Date
1 2014-07-29 13:00:00
2 2014-07-29 13:01:00
3 2014-07-29 13:07:00

正如你所看到的,第一行和第二行之间的时间差是 1 分钟,所以我忽略了,那么我应该检查第二行和第三行之间的时间。由于时差为 6 分钟,我想对比较的日期提出一个异常(exception)。

该表可能包含许多行,因此我会检查上一条记录的下一条记录,依此类推...

我怎样才能在 SQL Server 中实现这一点。我可以执行 datediff,但我会有很多行,并且我不想手动执行此操作。

有什么建议吗?

注意* 我不需要担心一天与另一天的时间交叉,因为此任务仅用于一天。我将在 SQL 语句中指定 where date = getdate()

最佳答案

一种方法

WITH ordered AS
(
  SELECT *, ROW_NUMBER() OVER (ORDER BY date) rn
    FROM table1 
)
SELECT o1.id id1, o1.date date1, o2.id id2, o2.date date2, DATEDIFF(s, o1.date, o2.date) diff
  FROM ordered o1 JOIN ordered o2
    ON o1.rn + 1 = o2.rn 
 WHERE DATEDIFF(s, o1.date, o2.date) > 60

输出:

| ID1 |                       DATE1 | ID2 |                       DATE2 | DIFF |
|-----|-----------------------------|-----|-----------------------------|------|
|   2 | July, 29 2014 13:01:00+0000 |   3 | July, 29 2014 13:07:00+0000 |  360 |

这里是SQLFiddle 演示

关于sql - 查找时间戳之间的间隙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25027820/

相关文章:

sql - PostgreSQL 中的递归 CTE 问题

mysql - 使用多个表删除并在子查询中重复表

sql-server - AWS RDS SQL Server 无法删除数据库

sql-server - 将 VARBINARY 的字符串表示形式转换为 VARBINARY 值

sql - 我如何知道我的 bacpac 适用于哪个版本的 SQL Server? (我在 Ubuntu 上使用 SQL Server 2019 express)

sql-server - 连接 HANA 数据库中的两列

mysql - 获取 SELECT 语句中的最后 3 行并使其成为 ASC 顺序

sql - 自动完成从一个巨大的表中获取数据

sql - 如何在 sqlite 中限制 group_concat 子组?

mysql - SQL 从逗号分隔的字符串中选择查询