SQL Server - 存储过程问题以获取Matrix类型的数据

时间:2011-09-28 11:43:51

标签: sql sql-server

需要帮助,请努力做到这一点

表格中有以下字段

Package_Name
Package_StartTime
Package_Endtime

我需要的是:

根据数据范围,给出每个程序包花费时间执行的时间

Package Name - 21 Sept    22 Sept    23 Sept
ABC             3 mins     4 mins      2 mins

这样我希望看到包的执行时间模式。

2 个答案:

答案 0 :(得分:0)

尝试此操作以获取数据

select package_Name as Package,Package_StartTime as Start,
        DateDiff(s,Package_StartTime,Package_EndTime) as Time
from table
where Package_StartTime >= @StartOfRange and Package_EndTime <= @EndOfRange

如果要使用

,可以格式化SQL内部的秒数
cast((DateDiff(s,Package_StartTime,Package_EndTime) / 60) as varchar(2)) + 
  ':' + cast((DateDiff(s,Package_StartTime,Package_EndTime) % 60) as varchar(2))

这将返回一个看起来像这样的结果集......

 Package     Start       Time 
  ABC         9/21/2011   360 
  ABC         9/22/2011   570 
  etc.

 Package     Start       Time 
  ABC         9/21/2011   6:00 
  ABC         9/22/2011   9:30 
  etc.

取决于您获取时间列的方式

如果您使用的是SQL 2005及更高版本,则可以使用PIVOT在列之间进行传播...以下是一个很好的链接,其中包含如何使用PIVOT的示例

快速PIVOT示例,未经测试,但希望能帮助您入门。

select * from PackageTableAbove
pivot (max (Time) for Start in ([9/21/2011],[9/22/2011],
                 [9/23/2011],[9/24/20111])) as PackageTimePerDay

如果您不想对日期进行硬编码,可以使用动态SQL来构建上述语句。我假设每个包每天运行一次,我使用Max(时间)。

答案 1 :(得分:0)

对于每个包,此查询将计算StartTimeEndTime之间每天的执行时间(分钟)。

解决方案:

CREATE TABLE dbo.Package
(
    Name NVARCHAR(10) PRIMARY KEY
    ,StartTime DATETIME NOT NULL
    ,EndTime DATETIME NOT NULL
);

INSERT  dbo.Package 
SELECT  'A', '2011-01-01T00:02:00', '2011-01-01T00:05:00'
UNION ALL
SELECT  'B', '2011-01-01T23:50:00', '2011-01-02T00:04:00'
UNION ALL
SELECT  'C', '2011-01-01T23:50:00', '2011-01-01T23:59:00'
UNION ALL
SELECT  'D', '2011-01-02T22:10:00', '2011-01-05T01:00:00';

WITH PivotSource
AS
(
    SELECT  a.Name
            ,CONVERT(VARCHAR(25),b.DayStartTime,112) [Day]
            ,DATEDIFF(MINUTE,b.DayStartTime,b.DayEndTime) DayMinutes
    FROM    dbo.Package a
    CROSS APPLY
    (
        SELECT  v.number
                ,CONVERT(VARCHAR(25),DATEADD(DAY,v.number,a.StartTime),112) IntermediateTime
                ,CASE 
                    WHEN v.number=0 THEN a.StartTime
                    ELSE CONVERT(VARCHAR(25),DATEADD(DAY,v.number,a.StartTime),112)
                END DayStartTime
                ,CASE 
                    WHEN CONVERT(VARCHAR(25),a.EndTime,112)=CONVERT(VARCHAR(25),DATEADD(DAY,v.number,a.StartTime),112) THEN a.EndTime
                    ELSE CONVERT(VARCHAR(25),DATEADD(DAY,v.number,a.StartTime),112)+' 23:59:59.999'
                END DayEndTime          
        FROM    master.dbo.spt_values v
        WHERE   v.type = 'P'
        AND     v.number <= DATEDIFF(DAY,a.StartTime,a.EndTime)
    ) b
)
SELECT  pvt.*
FROM    PivotSource cte
PIVOT( SUM(cte.DayMinutes) FOR cte.[Day] IN ([20110101],[20110102],[20110103],[20110104],[20110105]) ) pvt

DROP TABLE dbo.Package;

结果:

Name       20110101    20110102    20110103    20110104    20110105
---------- ----------- ----------- ----------- ----------- -----------
A          3           NULL        NULL        NULL        NULL
B          10          4           NULL        NULL        NULL
C          9           NULL        NULL        NULL        NULL
D          NULL        110         1440        1440        60