2011-05-13 6 views
1

저는 데이터베이스 프로그래밍에 익숙하지 않아 복잡한 t-SQL 쿼리 인 것처럼 보이는 것을 작성하는 데 도움이 필요합니다.시간 데이터의 틈을 확인하는 쿼리

우리 데이터베이스는 시간 데이터를 그 당시 기록 된 다양한 레벨과 함께 저장합니다. 일반적인 측정은 몇 주 또는 몇 달 동안 지속됩니다. 계측기가 통신하지 않았을 때를 알 수 있도록 시간 데이터의 갭을 식별하려면 SqlServer2005에 쿼리를 작성해야합니다. 우리의 샘플 간격은 1 초 또는 0.5 초일 수 있지만, 주어진 측정에서 항상 동일합니다 (즉, 측정의 모든 샘플은 1 또는 0.5 샘플/초입니다). 이상적

I는 [블록 1 엔드 블록 1 개시] 의리스트를 얻고 자하는 것이다 [보간에 스타트 블록 2 엔드] 등 각 블록은 전체 측정에서 연속적인 시간의 단위이다

.

이 쿼리를 더 쉽게 만들 수있는 명령이 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

오라클은이를 위해 많은 훌륭한 분석 기능을 제공합니다.

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}