asp.net - 总结历史正常运行时间数据

标签 asp.net sql-server sql-server-2012

我正在完成我的第一个 ASP.NET Web 应用程序,但遇到了一个难题。该网络应用程序旨在测试全国各地的网络设备并记录响应时间。 Windows 服务定期检查这些设备,通常每 1-10 分钟一次。然后,使用此设计将每次检查的结果记录在 SQL Server 表中。 (当设备关闭时,ResponseTime 为 NULL。)

CREATE TABLE [dbo].[DeviceStatuses] (

[DeviceStatusID] INT      IDENTITY (1, 1) NOT NULL,
[DeviceID]       INT      NOT NULL,
[StatusTime]     DATETIME NULL,
[ResponseTime]   INT      NULL,
CONSTRAINT [PK_DeviceStatuses] PRIMARY KEY CLUSTERED ([DeviceStatusID] ASC),
CONSTRAINT [FK_DeviceStatuses_Devices] FOREIGN KEY ([DeviceID]) REFERENCES [dbo].[Devices] ([DeviceID])
);

该服务已经运行了几个月,设备数量最少,表约有 500,000 行。客户希望能够访问每台设备的 3 个月滚动停机时间摘要。大致如下:

停机时间:
2012 年 12 月 11 日下午 3:20 - 下午 3:42
2012 年 12 月 20 日上午 1:00 - 上午 9:00

据我所知,我需要获取每个 NULL ResponseTimes block 的开始和结束的 StatusTime,当然是针对特定的 DeviceID。我在 Google 和 StackOverflow 上进行了多次搜索,但没有找到任何与我想要做的事情相似的内容。 (也许我没有使用正确的搜索词。)我的兄弟,一位更有经验的程序员,建议我也许能够在 SQL Server 中使用 CURSOR,尽管他承认 CURSOR 的性能很糟糕,并且需要计划任务。有什么建议吗?

最佳答案

declare  @DeviceStatuses table(

[DeviceStatusID] INT      IDENTITY (1, 1) NOT NULL,
[DeviceID]       INT      NOT NULL,
[StatusTime]     DATETIME NULL,
[ResponseTime]   INT      NULL)


Insert into @DeviceStatuses([DeviceID],[StatusTime],[ResponseTime])
Values
(1,'20120101 10:10',2),(1,'20120101 10:12',NULL),(1,'20120101 10:14',2),
(1,'20120102 10:10',2),(1,'20120102 10:12',NULL),(1,'20120102 10:14',2),
(2,'20120101 10:10',2),(2,'20120101 10:12',NULL),(2,'20120101 10:14',2),
(2,'20120101 10:19',2),(2,'20120101 10:20',NULL),(2,'20120101 10:21',NULL),(2,'20120101 10:22',2),
(2,'20120102 10:10',2),(2,'20120102 10:12',NULL),(2,'20120102 10:14',2);

Select [DeviceID],MIN([StatusTime]) as StartDown,MAX([StatusTime]) as EndDown
from
(
Select [DeviceID],[StatusTime]
,(Select MAX([StatusTime]) from @DeviceStatuses s2 where s2.DeviceID=s1.DeviceID and s2.StatusTime<s1.StatusTime and s2.ResponseTime is not null) as gr
from @DeviceStatuses s1
where s1.ResponseTime is null
)a
Group by [DeviceID],gr
order by [DeviceID],gr

关于asp.net - 总结历史正常运行时间数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14147017/

相关文章:

c# - 如何在 asp.net 中使用日期和整数作为发票号

javascript - ASP.Net VB 从代码隐藏调用 JavaScript 函数

mysql - 将 SQL 脚本转换为 MySQL 脚本

sql-server - 如何将 SQL Server Express 实例从 2012 升级到 2014

c# - DBCC SHRINKFILE 的进展

Asp.net:替换 GenericPrincipal

asp.net - 如何在asp.net网站中使用ReportingCloud?

sql-server - 奇怪的 "There is already an object in the database."错误

c# - Entity Framework ALTER TABLE 语句与 FOREIGN KEY 约束冲突

sql - 如何将文件表与 SQL Server 中的现有表链接