需要帮助,请努力做到这一点
表格中有以下字段
Package_Name
Package_StartTime
Package_Endtime
我需要的是:
根据数据范围,给出每个程序包花费时间执行的时间
像
Package Name - 21 Sept 22 Sept 23 Sept
ABC 3 mins 4 mins 2 mins
这样我希望看到包的执行时间模式。
答案 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)
对于每个包,此查询将计算StartTime
和EndTime
之间每天的执行时间(分钟)。
解决方案:
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