範囲を広げることもできますが、意図したものとは異なるレコードが返される可能性があります。
SELECT RECORD, EVENT, TIME
FROM SO_RecordEvent AS R
WHERE TIme BETWEEN '6/26/2012 9:55AM' AND '6/26/2012 11:06AM'
これにより、範囲内の開始時刻または終了時刻のいずれかを持つすべてのレコードが返されます。これには、範囲外の関連レコードも含まれます(つまり、範囲内に1回しか含まれていないが、その前または後に開始されたレコード)それ以外の開始時刻または終了時刻が表示されます)、範囲を短くすることができます。
;WITH X AS
(
SELECT RECORD,EVENT,TIME FROM SO_RecordEvent
)
SELECT R.RECORD,R.EVENT,R.TIME
FROM SO_RecordEvent AS R
INNER JOIN X ON R.Record = X.Record
WHERE X.TIme BETWEEN '6/26/2012 10:05AM' AND '6/26/2012 11:05AM'
GROUP BY R.RECORD,R.EVENT,R.TIME
しかし、レコード2の例のように、範囲外で開始および終了した場合でも、その間に開始されたすべてのものを本当に提供する、このようなものが本当に必要になると思います。
編集
変更されたロジック-状況に対処する代わりに、このように考えることにしました-開始と終了内で開始したもの、開始と終了内で終了したもの、および前後に開始したもの。これは、この期間中に実行されるすべてのものをカバーすると思います(内で終了する前に開始し、内で開始および終了し、内で開始および後に終了し、前に開始し、後に終了します)
SELECT X.RECORD,X.TIME AS STARTTIME,Y.TIME AS ENDTIME
FROM SO_RecordEvent AS X
INNER JOIN SO_RecordEvent Y ON Y.Record = X.Record AND Y.EVENT = 'END'
WHERE X.EVENT = 'START'
AND
((X.TIME >= '6/26/2012 10:00AM' AND X.TIME <= '6/26/2012 11:00AM')
OR (Y.TIME >= '6/26/2012 10:00AM' AND Y.TIME <= '6/26/2012 11:00AM')
OR (X.TIME <= '6/26/2012 10:00AM' AND Y.TIME >= '6/26/2012 11:00AM'))
遊ぶ変数:
DECLARE @START datetime, @END datetime
SET @START = '6/26/2012 10:00AM'
SET @END = '6/26/2012 11:00AM'
SELECT X.RECORD,X.TIME AS STARTTIME,Y.TIME AS ENDTIME
FROM SO_RecordEvent AS X
INNER JOIN SO_RecordEvent Y ON Y.Record = X.Record AND Y.EVENT = 'END'
WHERE X.EVENT = 'START'
AND
((X.TIME >= @START AND X.TIME <= @END)
OR (Y.TIME >= @START AND Y.TIME <= @END)
OR (X.TIME <= @START AND Y.TIME >= @END))