从日期范围行中选择的多行

时间:2009-09-16 13:41:36

标签: sql-server-2005 datetime

表示例:

表名:停机时间

柱:
EventID - int,
ReasonID - int,
StartTime - DateTime,
EndTime - DateTime

我想计算过去30天内每个活动的每日停机时间。但是,事件可能会持续多天,因此开始时间可能会在31天前开始,并可能在下周结束。所以我需要为该事件返回一行数据30次。该事件也可能是10分钟,所以我需要一行数据显示。

到目前为止,我只得到一行代表30天内发生的整个事件,而不是30行。

MS SQL Server 2005数据库

感谢您的帮助。

2 个答案:

答案 0 :(得分: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) 

这样一来,如果你有停机时间,你每天都会得到一行包含停机时间。

答案 1 :(得分:0)

在尝试我的代码之前,您需要对Numbers表进行一次设置。这将创建一个表名称Number,其列号为行,值为1到10,000:

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

输出:

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)