表格中有很多行。该表有一个Date列(包括日期和时间)
我希望能够遍历表格并找到两行之间的差距,其中行之间的差异为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中实现这一点。我可以做一个约会,但我会有很多行,我不想手动执行此操作。
有什么建议吗?
注意*我不需要担心从一天到另一天的交叉时间,因为这项任务仅用于一天。我将在SQL语句中指定date = getdate()
答案 0 :(得分:8)
一种方法
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 演示
答案 1 :(得分:3)
由于您使用的是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分钟的所有行。假设行按日期的升序排序。
答案 2 :(得分:2)
如果您可以利用ID列升序并递增1:
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