查找带有时间戳间隔的连续记录> 15分钟

时间:2013-02-07 15:45:58

标签: sql sql-server timestamp sql-server-2012 intervals

进程每15分钟运行一次(应该运行)并添加并进入MS SQL 2012日志记录表。

2013-02-07 10:07:47.000
2013-02-07 09:52:36.000
2013-02-07 09:37:34.000
2013-02-07 09:22:32.000
2013-02-07 09:07:31.000
2013-02-07 08:52:29.000
2013-02-07 08:37:28.000
2013-02-07 08:13:53.000
2013-02-07 07:58:51.000
2013-02-07 07:43:50.000
2013-02-07 07:28:48.000
2013-02-07 07:13:47.000
2013-02-07 06:58:37.000

我需要有关查询的帮助,该查询将返回>的连续时间戳。相隔16分钟。在上述记录中,查询将返回2013-02-07 08:37:28.000和2013-02-07 08:13:53.000

编辑 - 添加对MS SQL的引用

2 个答案:

答案 0 :(得分:3)

这个问题的答案很大程度上取决于您使用的RDBMS。

这样的事情应该适用于使用DATEDIFFROW_NUMBER的SQL Server:

WITH CTE AS (
  SELECT ProcessTime, ROW_NUMBER() OVER (ORDER BY ProcessTime DESC) RN
  FROM Process
  )
SELECT P.ProcessTime, 
  P2.ProcessTime as ProcessTime2, 
  DATEDIFF(mi,  P.ProcessTime, P2.ProcessTime)
FROM CTE P
  JOIN CTE P2 ON P.RN = P2.RN + 1
WHERE DATEDIFF(mi, P.ProcessTime, P2.ProcessTime) > 16

它将日期放在两个单独的列中 - 如果愿意,很容易放入一个列中。

这是Fiddle

如果您告诉我们RDBMS,我们可以根据需要组建替代解决方案。

对于Oracle,使用extract( minute from P2.ProcessTime - P.ProcessTime ) vs DATEDIFF - 查询的其余部分应该有效 - 这里是Fiddle

对于MySQL,代码会有所不同,因为MySQL不支持CTEsROW_NUMBER。但这应该会让你朝着正确的方向前进。

祝你好运。

答案 1 :(得分:2)

基本思路是在系列中输入下一个时间戳,然后选择差值大于16的行。

以下查询使用相关子查询计算下一个时间戳:

select *
from (select t.*,
             (select MIN(t.timestamp) from t t2 where t2.timestamp > t.timestamp
             ) as nextTimestamp
      from t
     ) t
where DATEDIFF(min, timestamp, nextTimestamp) > 16

where子句与数据库有关,但它提供了如何执行此操作的想法。

在SQL Server 2012上,您可以执行以下操作:

select *
from (select t.*,
             lead (t.timestamp) over (order by timestamp) as nextTimestamp
      from t
     ) t
where DATEDIFF(mi, timestamp, nextTimestamp) > 16

(假设您的时间戳存储为datetime)。