2011-05-13 8 views
1

私はデータベースプログラミングに慣れていないので、複雑なt-SQLクエリと思われるものを書くのに助けが必要です。時刻データの隙間を確認するクエリ

私たちのデータベースには、その時に記録されたさまざまなレベルとともに時間データが格納されています。典型的な測定は数週間または数ヶ月間続くでしょう。私はSqlServer2005にクエリを書いて、計測器が通信していない時を知るための時間データのギャップを特定する必要があります。サンプル間隔は1秒または0.5秒ですが、測定値は常に同じです(つまり、測定のすべてのサンプルは1または0.5サンプル/秒になります)。理想的

Iは[ブロック1エンドBLOCK1スタート] のリストを取得したい [BLOCK2スタートBLOCK2エンド] 等の各ブロックは、全体の測定範囲内の連続した時間の単位である

このクエリを簡単にするコマンドがTSQLにありますか?

+0

測定時間は重複している可能性がありますか? – Keith

+1

[シンプルトークのこの記事](http://www.simple-talk.com/sql/t-sql-programming/find-missing-date-ranges-in-sql/)を参照してください。 – Andomar

+0

いいえ、いいえ時間が重なる – Curtis

答えて

3

これをチェックしてください。間隔が重複していないため、これらの結果を返す簡単なSQLクエリを書くことができます。以下のSQLは、測定テーブルをシミュレートする@Eventsというダミーテーブル変数を作成します。最後のクエリは、1秒を超えるギャップを出力します(変数@MaxIntervalAllowedBetweenEventsで設定可能)。あなたのテーブルが既にそれにアイデンティティを持っている場合

-- table with dummy data 
declare @Events table (
    ID   int IDENTITY NOT NULL, 
    StartDate datetime NOT NULL, 
    EndDate  datetime NOT NULL 
) 
INSERT @Events VALUES ('1/1/2011 1:00am', '1/1/2011 2:00am') 
INSERT @Events VALUES ('1/1/2011 2:00am', '1/1/2011 3:00am') -- no gap after previous event 
INSERT @Events VALUES ('1/1/2011 3:01am', '1/1/2011 4:00am') -- 1 minute gap 
INSERT @Events VALUES ('1/1/2011 4:30am', '1/1/2011 5:00am') -- 30 minute gap 


-- this variable defines the maximum interval allowed between events 
declare @MaxIntervalAllowedBetweenEvents int 
set @MaxIntervalAllowedBetweenEvents = 1 -- # seconds 


-- select the gaps between events 
SELECT 
    e1.EndDate, 
    Min(e2.StartDate) as NextEventStartDate, 
    DateDiff(s, e1.EndDate, Min(e2.StartDate)) as SecondsBetweenEvents 
FROM 
    @Events as e1 
join 
    -- for each event in e1, get the event that immediately follows it 
    @Events as e2 
     on (e1.EndDate <= e2.StartDate) 
GROUP BY 
    e1.EndDate 
HAVING 
    -- filter out events that are too close to each other 
    (DateDiff(s, e1.EndDate, Min(e2.StartDate)) > @MaxIntervalAllowedBetweenEvents) 
ORDER BY 
    e1.EndDate 
+0

かなり良い解決策。私はあなたがこのための手続きを必要としていると思いました。しかし、あなたは簡単にこれもSQLであることができるように見えます。 – H20rider

+0

ありがとう!今、日付が重複する可能性があれば、それは本当に複雑です。 – Keith

+0

これは素晴らしいですね。私はそれを撃つだろう。ありがとう! – Curtis

1

Oracleには、これに関する優れた分析機能がたくさんあります。

私は、Date、StartTime、EndTimeの結果を注文するSQL文からカーソルを作成する必要があると思います。

1

入力がログインの間の時間を取得するには、このように使用することができます日を要しテーブル...

は、ROW_NUMBERビットを省略します。

{select 
    Start.ID 
    ,Done.ID 
    ,Start.<Date_Column> 
    ,Done.<Date_Column> 
    ,DATEDIFF(s,Start.<Date_Column>,Done.<Date_Column>) AS InBetween 
from 
    (SELECT 
     ROW_NUMBER() OVER (ORDER BY <Date_Column>) AS ID 
     ,<Date_Column> 
    FROM 
     <Tablename> (NOLOCK) 
    ) START 
    INNER JOIN (
     SELECT 
      ROW_NUMBER() OVER (ORDER BY <Date_Column>) AS ID 
      ,<Date_Column> 
     FROM 
      <Tablename> (NOLOCK) 
     ) DONE ON START.ID + 1 = DONE.ID 
ORDER BY 
    DATEDIFF(s,Start.<Date_Column>,Done.<Date_Column>)DESC} 
関連する問題