2009-09-16 2 views
0

표 예를 행였다여러 행이

지난 30 일 동안 각 이벤트의 일일 중단 시간을 계산하고 싶습니다. 그러나 이벤트가 여러 날 동안 중단 될 수 있으므로 시작 시간은 31 일 전에 시작될 수 있으며 다음 주에 끝날 수 있습니다. 따라서 해당 이벤트에 대한 데이터 행을 30 번 반환해야합니다. 이벤트는 10 분 길이 일 수 있으므로이를 보여주는 일련의 데이터가 필요합니다.

지금까지 나는 30 행 대신 30 일 이상 발생하는 전체 이벤트를 나타내는 행 하나만 얻습니다.

MS SQL Server 2005 데이터베이스

감사합니다.

+0

@TBG이 답변 중 어떤 것이 도움이 되었습니까? –

답변

1

당신은 날짜 차원 테이블 만들 수 있습니다 - 일의 모음입니다 테이블. 당신의 목적을위한 가장 단순한 예제는 하나의 컬럼, 날짜를 가지며, 당신은 매 연속적인 날마다 하나의 행을 가질 것입니다. Youu 그런 다음 다운 타임 테이블이 테이블에 가입 할 수 :

from dim_date t join downtime d on t.date between convert(varchar(10), d.start_date, 120) and convert(varchar(10), d.end_date, 120) 

당신이 아래로 시간이있는 경우이 방법을 사용하면 매일 시간을 포함에 대한 행을 얻을 것이다.

+0

숫자 테이블을 사용하는 것이 좋으며 날짜 테이블보다 더 많은 용도가 있습니다. http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-numbers-table.html –

0

코드를 사용하기 전에 Numbers 테이블을 한 번 설정해야합니다. 이 열 수는 1 만까지 값을 갖는 행을 갖는 테이블 이름을 숫자를 생성합니다 :

이 숫자 테이블이 필요한 행을 "작성"기존 테이블에 가입되어
SELECT TOP 10000 IDENTITY(int,1,1) AS Number 
    INTO Numbers 
    FROM sys.objects s1 
    CROSS JOIN sys.objects s2 
ALTER TABLE Numbers ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number) 

,이 시도 :

DECLARE @DownTime table (
EventID int, 
ReasonID int, 
StartTime DateTime, 
EndTime DateTime) 

INSERT INTO @DownTime VALUES (1,1,'9/10/2009 9:00am','9/10/2009 10:00am') 
INSERT INTO @DownTime VALUES (2,1,'9/10/2009 1:00am','9/15/2009 1:00am') 
INSERT INTO @DownTime VALUES (3,1,'9/10/2009'  ,'9/11/2009') 

SELECT 
    d.EventID,d.ReasonID,d.StartTime,d.EndTime 
     , DATEADD(day,Number-1,d.StartTime) AS SequenceDate 
    FROM @DownTime   d 
     INNER JOIN Numbers n ON n.Number<=DATEDIFF(day,d.StartTime,d.EndTime)+1 

출력 :

EventID ReasonID StartTime    EndTime     SequenceDate 
------- -------- ----------------------- ----------------------- ----------------------- 
1  1  2009-09-10 09:00:00.000 2009-09-10 10:00:00.000 2009-09-10 09:00:00.000 
2  1  2009-09-10 01:00:00.000 2009-09-15 01:00:00.000 2009-09-10 01:00:00.000 
2  1  2009-09-10 01:00:00.000 2009-09-15 01:00:00.000 2009-09-11 01:00:00.000 
2  1  2009-09-10 01:00:00.000 2009-09-15 01:00:00.000 2009-09-12 01:00:00.000 
2  1  2009-09-10 01:00:00.000 2009-09-15 01:00:00.000 2009-09-13 01:00:00.000 
2  1  2009-09-10 01:00:00.000 2009-09-15 01:00:00.000 2009-09-14 01:00:00.000 
2  1  2009-09-10 01:00:00.000 2009-09-15 01:00:00.000 2009-09-15 01:00:00.000 
3  1  2009-09-10 00:00:00.000 2009-09-11 00:00:00.000 2009-09-10 00:00:00.000 
3  1  2009-09-10 00:00:00.000 2009-09-11 00:00:00.000 2009-09-11 00:00:00.000 

(9 row(s) affected)