Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 找出时间戳之间的间隔_Sql_Sql Server - Fatal编程技术网

Sql 找出时间戳之间的间隔

Sql 找出时间戳之间的间隔,sql,sql-server,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分钟,我想对比较的日期抛出一个例外 这个表可能包含很多行,所以我会去检查上一条记录的下一条记录,然后

我桌子上有许多行。该表有一个日期列,其中包括日期和时间

我希望能够在表中循环,并找到两行之间的任何间隙,其中两行之间的差值为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分钟,我想对比较的日期抛出一个例外

这个表可能包含很多行,所以我会去检查上一条记录的下一条记录,然后检查下一条记录

如何在SQL Server中实现这一点。我可以做一个datediff,但我会有很多行,我不想手动执行

有什么建议吗


注意*我不需要担心从一天到另一天的时间交叉,因为这个任务只用于一天。我将在SQL语句中指定date=getdate

因为您使用的是SQL Server 2012,所以可以使用LEAD和LAG函数,如下所示:

;with cte as
(select id, 
 [date], 
 datediff(minute,[date],lead([date],1,0) over (order by [date])) difference,
 row_number() over (order by [date]) rn
from tbl)

select * from cte
where rn <> 1 --Skip first row ordered by the date
and difference > 5
这将返回与下一行相差超过5分钟的所有行。假设行按日期升序排序

一种方法

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 |
下面是演示

如果您可以利用ID列升序和递增一:

select a.id, b.id, a.date, b.date
  from mytable a
  join mytable b
    on b.id = a.id - 1
 where datediff(minute, a.date, b.date) < 5
如果你不能利用这一点:

with x as (
select row_number() over(order by date) as rownum, date
  from mytable
)
select a.rownum, b.rownum, a.date, b.date
  from x a
  join x b
    on b.rownum = a.rownum - 1
 where datediff(minute, a.date, b.date) < 5

您使用的是哪个版本的SQL Server?我不知道使用SQL Server时您会怎么做,但是,如果使用应用程序服务器查询数据库,然后仅对数据执行for循环,则很容易做到这一点。请尝试在您的过程中使用此方法。您是否保证每行的ID增加1,并且后一行的时间戳更大?不,ID是随机的。我只是举个例子,它几乎能起作用。请看这个[链接]第一行和第二行之间的时间差是7分钟,所以它应该返回第一个日期和第二个日期。第二行和第三行之间的差异为1分钟忽略,第三行和第四行之间的差异为12分钟。因此,它应返回第三行日期和第四行日期。您可以删除where rn1条件以解决此问题。+1,因为这将从SQL Server 2005起生效。假设有索引,则具有自联接的解决方案与具有分析函数的解决方案之间的性能差异是什么?