![](/img/trans.png)
[英]In SQL Server 2012, how do I get the column name and data type from a view, function, or stored procedure?
[英]SQL Server - Stored Procedure issue to get Matrix type of data
需要帮助,请努力进行
在表中获得以下字段
Package_Name
Package_StartTime
Package_Endtime
我需要的是:
根据数据范围,我可以了解每个程序包执行所需的时间
喜欢
Package Name - 21 Sept 22 Sept 23 Sept
ABC 3 mins 4 mins 2 mins
这样,我想查看程序包的执行时间模式。
试试这个来获取数据
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,可以在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(Time)。
对于每个包,此查询将计算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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.