2009-09-16 47 views
0

表例如:多行范围行

表名:停机

色谱柱:
事件ID - INT,
ReasonID - INT,
开始时间 - 日期时间,
结束时间 - 日期时间

我想计算过去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到10000:

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) 

这Numbers表格已加入到现有的表“创造”你所需要的行,试试这个:

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 

OUTPUT:

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)