将服务器状态数据转换为运行24小时表格格式

时间:2013-04-19 14:58:24

标签: sql-server xml linq c#-4.0

我需要在使用c#的asp.net网格视图中以5分钟为增量显示最近24小时的运行服务器状态。数据位于以下形式的SQL Server记录中:HostName,RecordDate,RecordTime,Status。我需要将数据转换为表格格式以加载网格视图控件。转换为类似:HostName,Date,00:00 status,00:05 status,...,23:55状态。当然,其中一个问题是用户可以随时访问网页。列名必须是5分钟的增量时间,如15.30,15.35等。它们将始终相同,因为将显示24小时,但将以不同的顺序,并可能交叉日期,具体取决于何时用户登录网站。我希望我已经解释得这么好了。所有选项都在桌面上:linq,linq to sql,linq to xml等等。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我将提供T-SQL解决方案。您需要一个日期表,其中包含相关日期的5分钟间隔。左边连接与您的AccessLog(或其所谓的)表,访问时间在每个时间范围内,并执行您想要的任何聚合。这将为您提供垂直列表。然后你需要PIVOT来使你的TimeRanges成为列(搜索SQL服务器PIVOT运算符)。

下面是粗略的SQL。之后,您只需将结果包装成一个支点。

declare @myDate SMALLDATETIME = '20130415';

;with TimeRanges as (
    SELECT  TOP 288 DateAdd(minute, (Row_Number() over (order by sc1.Name) -1) * 5 , @myDate) TimeRangeMin
            , DateAdd(minute, Row_Number() over (order by sc1.Name) * 5 , @myDate) TimeRangeMax
    FROM    Master.dbo.SysColumns sc1, Master.dbo.SysColumns sc2
)
select  convert(varchar(5), TimeRangeMin, 114) AS TimeRange, COUNT(*)
from    TimeRanges t
        LEFT JOIN AccessLog a on a.AccessTime >= t.TimeRangeMin and a.AccessTime < t.TimeRangeMax
GROUP BY convert(varchar(5), TimeRangeMin, 114);