2

プロセスは15分ごとに実行され(実行されることになっています)、MSSQL2012ログテーブルにエントリを追加します。

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を返します。

編集-MSSQLへの参照を追加します

4

2 に答える 2

3

この質問に対する答えは、使用しているRDBMSによって大きく異なります。

DATEDIFFこのようなものは、とを使用してSQLServerで機能するはずROW_NUMBERです。

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

日付を2つの別々の列に配置します。必要に応じて、1つの列に配置するのも簡単です。

これがフィドルです。

RDBMSをお知らせいただければ、必要に応じて別のソリューションをまとめることができます。

Oracleの場合、extract( minute from P2.ProcessTime - P.ProcessTime )vsを使用DATEDIFFします-クエリの残りの部分は機能するはずです-これがFiddleです。

CTEsMySQLの場合、MySQLはまたはをサポートしていないため、コードは少し異なりますROW_NUMBER。しかし、これはあなたを正しい方向に導くはずです。

幸運を。

于 2013-02-07T16:01:37.947 に答える
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)。

于 2013-02-07T16:03:26.527 に答える