Sql server 2005 从日期范围内的行中选择多行

Sql server 2005 从日期范围内的行中选择多行,sql-server-2005,datetime,Sql Server 2005,Datetime,表示例: 表名:停机时间 列: EventID-int, ReasonID-int, 开始时间-日期时间, EndTime-日期时间 我想计算过去30天内每个事件的每日停机时间。但是,一个事件可能会中断多天,因此开始时间可能会提前31天开始,并可能在下周结束。所以我需要返回该事件的一行数据30次。事件也可能长达10分钟,因此我需要一行数据来显示这一点 到目前为止,我只得到了一行,表示30天内发生的整个事件,而不是30行 MS SQL Server 2005数据库 谢谢您的帮助。在尝试我的代码之前

表示例:

表名:停机时间

列:
EventID-int,
ReasonID-int,
开始时间-日期时间,
EndTime-日期时间

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

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

MS SQL Server 2005数据库


谢谢您的帮助。

在尝试我的代码之前,您需要一次性设置数字表。这将创建一个名为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)
此数字表已连接到现有表以“创建”所需的行,请尝试以下操作:

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

您可能需要创建一个日期维度表—一个天数集合的表。对于您的目的来说,最简单的例子是有一列date,并且您将在连续的每一天中有一行。然后,您可以将此表加入停机时间表:

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) 

这样,如果你有休息时间,你会得到一行每天包含休息时间的数据。

我喜欢使用数字表,它们比日期表有更多的用途:@TBG,这些答案对你有帮助吗?
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)